8000 refactor handleFieldError · graphql-python/graphql-core@bce7a3d · GitHub
[go: up one dir, main page]

Skip to content

Commit bce7a3d

Browse files
committed
refactor handleFieldError
Replicates graphql/graphql-js@31e1f8c
1 parent afa6b93 commit bce7a3d

File tree

1 file changed

+70
-44
lines changed

1 file changed

+70
-44
lines changed

src/graphql/execution/execute.py

Lines changed: 70 additions & 44 deletions
< 8000 td data-grid-cell-id="diff-58ecd603ddbef47708eeb5b6c2f6705e1402cf43e64acae10766a8131796ddc3-1028-1048-2" data-line-anchor="diff-58ecd603ddbef47708eeb5b6c2f6705e1402cf43e64acae10766a8131796ddc3R1048" data-selected="false" role="gridcell" style="background-color:var(--diffBlob-additionLine-bgColor, var(--diffBlob-addition-bgColor-line));padding-right:24px" tabindex="-1" valign="top" class="focusable-grid-cell diff-text-cell right-side-diff-cell pt-4 left-side">+
Original file line numberDiff line numberDiff line change
@@ -944,7 +944,6 @@ def execute_field(
944944
calling its resolve function, then calls complete_value to await coroutine
945945
objects, serialize scalars, or execute the sub-selection-set for objects.
946946
"""
947-
errors = async_payload_record.errors if async_payload_record else self.errors
948947
field_name = field_group[0].name.value
949948
field_def = self.schema.get_field(parent_type, field_name)
950949
if not field_def:
@@ -983,16 +982,26 @@ async def await_completed() -> Any:
983982
try:
984983
return await completed
985984
except Exception as raw_error:
986-
error = located_error(raw_error, field_group, path.as_list())
987-
handle_field_error(error, return_type, errors)
985+
self.handle_field_error(
986+
raw_error,
987+
return_type,
988+
field_group,
989+
path,
990+
async_payload_record,
991+
)
988992
self.filter_subsequent_payloads(path, async_payload_record)
989993
return None
990994

991995
return await_completed()
992996

993997
except Exception as raw_error:
994-
error = located_error(raw_error, field_group, path.as_list())
995-
handle_field_error(error, return_type, errors)
998+
self.handle_field_error(
999+
raw_error,
1000+
return_type,
1001+
field_group,
1002+
path,
1003+
async_payload_record,
1004+
)
9961005
self.filter_subsequent_payloads(path, async_payload_record)
9971006
return None
9981007

@@ -1026,6 +1035,28 @@ def build_resolve_info(
10261035
self.is_awaitable,
10271036
)
10281037

1038+
def handle_field_error(
1039+
self,
1040+
raw_error: Exception,
1041+
return_type: GraphQLOutputType,
1042+
field_group: FieldGroup,
1043+
path: Path,
1044+
async_payload_record: AsyncPayloadRecord | None = None,
1045+
) -> None:
1046+
"""Handle error properly according to the field type."""
1047+
error = located_error(raw_error, field_group, path.as_list())
1048
1049+
# If the field type is non-nullable, then it is resolved without any protection
1050+
# from errors, however it still properly locates the error.
1051+
if is_non_null_type(return_type):
1052+
raise error
1053+
1054+
errors = async_payload_record.errors if async_payload_record else self.errors
1055+
1056+
# Otherwise, error protection is applied, logging the error and resolving a
1057+
# null value for this field if one is encountered.
1058+
errors.append(error)
1059+
10291060
def complete_value(
10301061
self,
10311062
return_type: GraphQLOutputType,
@@ -1138,11 +1169,9 @@ async def complete_awaitable_value(
11381169
if self.is_awaitable(completed):
11391170
completed = await completed
11401171
except Exception as raw_error:
1141-
errors = (
1142-
async_payload_record.errors if async_payload_record else self.errors
1172+
self.handle_field_error(
1173+
raw_error, return_type, field_group, path, async_payload_record
11431174
)
1144-
error = located_error(raw_error, field_group, path.as_list())
1145-
handle_field_error(error, return_type, errors)
11461175
self.filter_subsequent_payloads(path, async_payload_record)
11471176
completed = None
11481177
return completed
@@ -1198,7 +1227,6 @@ async def complete_async_iterator_value(
11981227
Complete an async iterator value by completing the result and calling
11991228
recursively until all the results are completed.
12001229
"""
1201-
errors = async_payload_record.errors if async_payload_record else self.errors
12021230
stream = self.get_stream_values(field_group, path)
12031231
complete_list_item_value = self.complete_list_item_value
12041232
awaitable_indices: list[int] = []
@@ -1236,14 +1264,14 @@ async def complete_async_iterator_value(
12361264
except StopAsyncIteration:
12371265
break
12381266
except Exception as raw_error:
1239-
error = located_error(raw_error, field_group, item_path.as_list())
1240-
handle_field_error(error, item_type, errors)
1267+
self.handle_field_error(
1268+
raw_error, item_type, field_group, item_path, async_payload_record
1269+
)
12411270
completed_results.append(None)
12421271
break
12431272
if complete_list_item_value(
12441273
value,
12451274
completed_results,
1246-
errors,
12471275
item_type,
12481276
field_group,
12491277
info,
@@ -1285,7 +1313,6 @@ def complete_list_value(
12851313
Complete a list value by completing each item in the list with the inner type.
12861314
"""
12871315
item_type = return_type.of_type
1288-
errors = async_payload_record.errors if async_payload_record else self.errors
12891316

12901317
if isinstance(result, AsyncIterable):
12911318
iterator = result.__aiter__()
@@ -1336,7 +1363,6 @@ def complete_list_value(
13361363
if complete_list_item_value(
13371364
item,
13381365
completed_results,
1339-
errors,
13401366
item_type,
13411367
field_group,
13421368
info,
@@ -1370,7 +1396,6 @@ def complete_list_item_value(
13701396
self,
13711397
item: Any,
13721398
complete_results: list[Any],
1373-
errors: list[GraphQLError],
13741399
item_type: GraphQLOutputType,
13751400
field_group: FieldGroup,
13761401
info: GraphQLResolveInfo,
@@ -1407,10 +1432,13 @@ async def await_completed() -> Any:
14071432
try:
14081433
return await completed_item
14091434
except Exception as raw_error:
1410-
error = located_error(
1411-
raw_error, field_group, item_path.as_list()
1435+
self.handle_field_error(
1436+
raw_error,
1437+
item_type,
1438+
field_group,
1439+
item_path,
1440+
async_payload_record,
14121441
)
1413-
handle_field_error(error, item_type, errors)
14141442
self.filter_subsequent_payloads(item_path, async_payload_record)
14151443
return None
14161444

@@ -1420,8 +1448,13 @@ async def await_completed() -> Any:
14201448
complete_results.append(completed_item)
14211449

14221450
except Exception as raw_error:
1423-
error = located_error(raw_error, field_group, item_path.as_list())
1424-
handle_field_error(error, item_type, errors)
1451+
self.handle_field_error(
1452+
raw_error,
1453+
item_type,
1454+
field_group,
1455+
item_path,
1456+
async_payload_record,
1457+
)
14251458
self.filter_subsequent_payloads(item_path, async_payload_record)
14261459
complete_results.append(None)
14271460

@@ -1787,12 +1820,12 @@ async def await_completed_items() -> list[Any] | None:
17871820
try:
17881821
return [await completed_item]
17891822
except Exception as raw_error: # pragma: no cover
1790-
# noinspection PyShadowingNames
1791-
error = located_error(
1792-
raw_error, field_group, item_path.as_list()
1793-
)
1794-
handle_field_error(
1795-
error, item_type, async_payload_record.errors
1823+
self.handle_field_error(
1824+
raw_error,
1825+
item_type,
1826+
field_group,
1827+
item_path,
1828+
async_payload_record,
17961829
)
17971830
self.filter_subsequent_payloads(
17981831
item_path, async_payload_record
@@ -1808,8 +1841,13 @@ async def await_completed_items() -> list[Any] | None:
18081841
completed_items = [completed_item]
18091842

18101843
except Exception as raw_error:
1811-
error = located_error(raw_error, field_group, item_path.as_list())
1812-
handle_field_error(error, item_type, async_payload_record.errors)
1844+
self.handle_field_error(
1845+
raw_error,
1846+
item_type,
1847+
field_group,
1848+
item_path,
1849+
async_payload_record,
1850+
)
18131851
self.filter_subsequent_payloads(item_path, async_payload_record)
18141852
completed_items = [None]
18151853

@@ -1850,8 +1888,9 @@ async def execute_stream_iterator_item(
18501888
raise StopAsyncIteration from raw_error
18511889

18521890
except Exception as raw_error:
1853-
error = located_error(raw_error, field_group, item_path.as_list())
1854-
handle_field_error(error, item_type, async_payload_record.errors)
1891+
self.handle_field_error(
1892+
raw_error, item_type, field_group, item_path, async_payload_record
1893+
)
18551894
self.filter_subsequent_payloads(item_path, async_payload_record)
18561895

18571896
async def execute_stream_iterator(
@@ -2231,19 +2270,6 @@ def execute_sync(
22312270
return cast(ExecutionResult, result)
22322271

22332272

2234-
def handle_field_error(
2235-
error: GraphQLError, return_type: GraphQLOutputType, errors: list[GraphQLError]
2236-
) -> None:
2237-
"""Handle error properly according to the field type."""
2238-
# If the field type is non-nullable, then it is resolved without any protection
2239-
# from errors, however it still properly locates the error.
2240-
if is_non_null_type(return_type):
2241-
raise error
2242-
# Otherwise, error protection is applied, logging the error and resolving a
2243-
# null value for this field if one is encountered.
2244-
errors.append(error)
2245-
2246-
22472273
def invalid_return_type_error(
22482274
return_type: GraphQLObjectType, result: Any, field_group: FieldGroup
22492275
) -> GraphQLError:

0 commit comments

Comments
 (0)
0