graphql-python / graphql-python/graphql-core-legacy

Exception traceback disappears when running middleware

Offen
#208 3 Kommentare 6 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
Vorherrschende Sprache
Python
Sterne
372
Forks
175
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

Here's a small example that illustrates the issue:

```python
import logging

import graphene

logging.basicConfig()

class Query(graphene.ObjectType):
hello = graphene.String()

def resolve_hello(self, info):
raise Exception('error')
return 'Hello'

schema = graphene.Schema(query=Query)

def middleware(next, root, info, **kwargs):
return next(root, info, **kwargs)
```

If we execute a query without any middleware, we get the traceback:

```
In [3]: schema.execute('{ hello }')
ERROR:graphql.execution.executor:An error occurred while resolving field Query.hello
Traceback (most recent call last):
File "/home/felipe/.local/share/virtualenvs/graphene-hello-viSdSxbU/local/lib/python2.7/site-packages/graphql/execution/executor.py", line 447, in resolve_or_error
return executor.execute(resolve_fn, source, info, **args)
File "/home/felipe/.local/share/virtualenvs/graphene-hello-viSdSxbU/local/lib/python2.7/site-packages/graphql/execution/executors/sync.py", line 16, in execute
return fn(*args, **kwargs)
File "", line 12, in resolve_hello
raise Exception('error')
Exception: error
ERROR:graphql.execution.utils:Traceback (most recent call last):
File "/home/felipe/.local/share/virtualenvs/graphene-hello-viSdSxbU/local/lib/python2.7/site-packages/graphql/execution/executor.py", line 447, in resolve_or_error
return executor.execute(resolve_fn, source, info, **args)
File "/home/felipe/.local/share/virtualenvs/graphene-hello-viSdSxbU/local/lib/python2.7/site-packages/graphql/execution/executors/sync.py", line 16, in execute
return fn(*args, **kwargs)
File "", line 12, in resolve_hello
raise Exception('error')
GraphQLLocatedError: error
```

But if we run it with the middleware, we get very little information:

```
In [4]: schema.execute('{ hello }', middleware=[middleware])
ERROR:graphql.execution.utils:GraphQLLocatedError: error
```

While investigating the issue, it looks like the point the traceback gets lost is around https://github.com/graphql-python/graphql-core/blob/master/graphql/execution/executor.py#L529. The promise gets rejected because of the exception, and then the `is_reject` handler returns *another* promise that gets immediately rejected. This new error has no traceback, so it doesn't get logged when it's caught inside `complete_value_catching_error`.

Beitragsleitfaden

Für dieses Repository ist kein Beitragsleitfaden indexiert

Rechercherichtung

Start with graphql/execution/executor.py around line 529 and follow the promise rejection path into complete_value_catching_error. Reproduce the supplied schema and middleware example, comparing execution with and without middleware. Done means the middleware case retains and logs the resolver traceback rather than only GraphQLLocatedError.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
python
Bereich
backend-api-design
Issue-Typ
Bug
Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.