Skip to content

Commit d528fad

Browse files
committed
Improved exception reporting
1 parent 8e1e1c0 commit d528fad

File tree

4 files changed

+22
-8
lines changed

4 files changed

+22
-8
lines changed

graphql/error/base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,4 @@ def locations(self):
4343
source = self.source
4444
if self.positions and source:
4545
self._locations = [get_location(source, pos) for pos in self.positions]
46-
return self._locations
46+
return self._locations

graphql/execution/base.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
# -*- coding: utf-8 -*-
2+
import sys
3+
24
from ..error import GraphQLError
35
from ..language import ast
46
from ..pyutils.default_ordered_dict import DefaultOrderedDict
@@ -13,9 +15,10 @@
1315
class _Undefined(object):
1416
def __bool__(self):
1517
return False
16-
18+
1719
__nonzero__ = __bool__
1820

21+
1922
Undefined = _Undefined()
2023

2124

@@ -89,6 +92,10 @@ def get_argument_values(self, field_def, field_ast):
8992

9093
return result
9194

95+
def report_error(self, error, traceback=None):
96+
sys.excepthook(type(error), str(error), getattr(error, 'stack', None) or traceback)
97+
self.errors.append(error)
98+
9299
def get_sub_fields(self, return_type, field_asts):
93100
k = return_type, tuple(field_asts)
94101
if k not in self._subfields_cache:

graphql/execution/executor.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,8 @@ def execute(schema, document_ast, root_value=None, context_value=None,
6363
middleware
6464
)
6565

66-
def executor(resolve, reject):
67-
return resolve(execute_operation(context, context.operation, root_value))
66+
def executor(v):
67+
return execute_operation(context, context.operation, root_value)
6868

6969
def on_rejected(error):
7070
context.errors.append(error)
@@ -75,7 +75,7 @@ def on_resolve(data):
7575
return ExecutionResult(data=data)
7676
return ExecutionResult(data=data, errors=context.errors)
7777

78-
promise = Promise(executor).catch(on_rejected).then(on_resolve)
78+
promise = Promise.resolve(None).then(executor).catch(on_rejected).then(on_resolve)
7979
if return_promise:
8080
return promise
8181
context.executor.wait_until_finished()
@@ -218,14 +218,16 @@ def complete_value_catching_error(exe_context, return_type, field_asts, info, re
218218
completed = complete_value(exe_context, return_type, field_asts, info, result)
219219
if is_thenable(completed):
220220
def handle_error(error):
221-
exe_context.errors.append(error)
221+
traceback = completed._traceback
222+
exe_context.report_error(error, traceback)
222223
return None
223224

224225
return completed.catch(handle_error)
225226

226227
return completed
227228
except Exception as e:
228-
exe_context.errors.append(e)
229+
traceback = sys.exc_info()[2]
230+
exe_context.report_error(e, traceback)
229231
return None
230232

231233

graphql/execution/executors/utils.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
1+
from sys import exc_info
2+
3+
14
def process(p, f, args, kwargs):
25
try:
36
val = f(*args, **kwargs)
47
p.do_resolve(val)
58
except Exception as e:
6-
p.do_reject(e)
9+
traceback = exc_info()[2]
10+
e.stack = traceback
11+
p.do_reject(e, traceback=traceback)

0 commit comments

Comments
 (0)