Skip to content

Exception traceback disappears when running middleware #208

Open
@flacerdk

Description

@flacerdk

Here's a small example that illustrates the issue:

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 "<ipython-input-1-89a125ef67fc>", 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 "<ipython-input-1-89a125ef67fc>", 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions