Skip to content

Commit 3093b5b

Browse files
committed
Do not double-wrap resolver errors (fixes #106)
1 parent a8de6f3 commit 3093b5b

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
@@ -590,17 +590,13 @@ def resolve_field_value_or_error(
590590
async def await_result() -> Any:
591591
try:
592592
return await result
593-
except GraphQLError as error:
594-
return error
595593
except Exception as error:
596-
return GraphQLError(str(error), original_error=error)
594+
return error
597595

598596
return await_result()
599597
return result
600-
except GraphQLError as error:
601-
return error
602598
except Exception as error:
603-
return GraphQLError(str(error), original_error=error)
599+
return error
604600

605601
def complete_value_catching_error(
606602
self,

tests/execution/test_resolve.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
from collections import ChainMap
22

33
from graphql import graphql_sync
4+
from graphql.error import GraphQLError
5+
from graphql.language import SourceLocation
46
from graphql.type import (
57
GraphQLArgument,
68
GraphQLField,
@@ -192,3 +194,29 @@ def execute(source, root_value=None):
192194
},
193195
None,
194196
)
197+
198+
def pass_error_from_resolver_wrapped_as_located_graphql_error():
199+
def resolve(_obj, _info):
200+
raise ValueError("Some error")
201+
202+
schema = _test_schema(GraphQLField(GraphQLString, resolve=resolve))
203+
result = graphql_sync(schema, "{ test }")
204+
205+
assert result == (
206+
{"test": None},
207+
[{"message": "Some error", "locations": [(1, 3)], "path": ["test"]}],
208+
)
209+
210+
assert result.errors is not None
211+
error = result.errors[0]
212+
assert isinstance(error, GraphQLError)
213+
assert str(error) == "Some error\n\nGraphQL request:1:3\n1 | { test }\n | ^"
214+
assert error.positions == [2]
215+
locations = error.locations
216+
assert locations == [(1, 3)]
217+
location = locations[0]
218+
assert isinstance(location, SourceLocation)
219+
assert location == SourceLocation(1, 3)
220+
original_error = error.original_error
221+
assert isinstance(original_error, ValueError)
222+
assert str(original_error) == "Some error"

0 commit comments

Comments
 (0)