Skip to content

Commit 6a6401b

Browse files
committed
Do not double-wrap resolver errors
Backport of a fix in the version 3.1 branch
1 parent aeb814b commit 6a6401b

File tree

2 files changed

+30
-6
lines changed

2 files changed

+30
-6
lines changed

src/graphql/execution/execute.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -626,17 +626,13 @@ def resolve_field_value_or_error(
626626
async def await_result():
627627
try:
628628
return await result
629-
except GraphQLError as error:
630-
return error
631629
except Exception as error:
632-
return GraphQLError(str(error), original_error=error)
630+
return error
633631

634632
return await_result()
635633
return result
636-
except GraphQLError as error:
637-
return error
638634
except Exception as error:
639-
return GraphQLError(str(error), original_error=error)
635+
return error
640636

641637
def complete_value_catching_error(
642638
self,

tests/execution/test_resolve.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
from graphql import graphql_sync
2+
from graphql.error import GraphQLError
3+
from graphql.language import SourceLocation
24
from graphql.type import (
35
GraphQLArgument,
46
GraphQLField,
@@ -165,3 +167,29 @@ def transforms_arguments_with_inputs_using_out_names():
165167
},
166168
None,
167169
)
170+
171+
def pass_error_from_resolver_wrapped_as_located_graphql_error():
172+
def resolve(_obj, _info):
173+
raise ValueError("Some error")
174+
175+
schema = _test_schema(GraphQLField(GraphQLString, resolve=resolve))
176+
result = graphql_sync(schema, "{ test }")
177+
178+
assert result == (
179+
{"test": None},
180+
[{"message": "Some error", "locations": [(1, 3)], "path": ["test"]}],
181+
)
182+
183+
assert result.errors is not None
184+
error = result.errors[0]
185+
assert isinstance(error, GraphQLError)
186+
assert str(error) == "Some error\n\nGraphQL request:1:3\n1 | { test }\n | ^"
187+
assert error.positions == [2]
188+
locations = error.locations
189+
assert locations == [(1, 3)]
190+
location = locations[0]
191+
assert isinstance(location, SourceLocation)
192+
assert location == SourceLocation(1, 3)
193+
original_error = error.original_error
194+
assert isinstance(original_error, ValueError)
195+
assert str(original_error) == "Some error"

0 commit comments

Comments
 (0)