Skip to content

Commit

Permalink
Do not double-wrap resolver errors (fixes #106)
Browse files Browse the repository at this point in the history
  • Loading branch information
Cito committed Sep 5, 2020
1 parent a8de6f3 commit 3093b5b
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 6 deletions.
8 changes: 2 additions & 6 deletions src/graphql/execution/execute.py
Original file line number Diff line number Diff line change
Expand Up @@ -590,17 +590,13 @@ def resolve_field_value_or_error(
async def await_result() -> Any:
try:
return await result
except GraphQLError as error:
return error
except Exception as error:
return GraphQLError(str(error), original_error=error)
return error

return await_result()
return result
except GraphQLError as error:
return error
except Exception as error:
return GraphQLError(str(error), original_error=error)
return error

def complete_value_catching_error(
self,
Expand Down
28 changes: 28 additions & 0 deletions tests/execution/test_resolve.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
from collections import ChainMap

from graphql import graphql_sync
from graphql.error import GraphQLError
from graphql.language import SourceLocation
from graphql.type import (
GraphQLArgument,
GraphQLField,
Expand Down Expand Up @@ -192,3 +194,29 @@ def execute(source, root_value=None):
},
None,
)

def pass_error_from_resolver_wrapped_as_located_graphql_error():
def resolve(_obj, _info):
raise ValueError("Some error")

schema = _test_schema(GraphQLField(GraphQLString, resolve=resolve))
result = graphql_sync(schema, "{ test }")

assert result == (
{"test": None},
[{"message": "Some error", "locations": [(1, 3)], "path": ["test"]}],
)

assert result.errors is not None
error = result.errors[0]
assert isinstance(error, GraphQLError)
assert str(error) == "Some error\n\nGraphQL request:1:3\n1 | { test }\n | ^"
assert error.positions == [2]
locations = error.locations
assert locations == [(1, 3)]
location = locations[0]
assert isinstance(location, SourceLocation)
assert location == SourceLocation(1, 3)
original_error = error.original_error
assert isinstance(original_error, ValueError)
assert str(original_error) == "Some error"

0 comments on commit 3093b5b

Please sign in to comment.