@@ -944,7 +944,6 @@ def execute_field(
944
944
calling its resolve function, then calls complete_value to await coroutine
945
945
objects, serialize scalars, or execute the sub-selection-set for objects.
946
946
"""
947
- errors = async_payload_record .errors if async_payload_record else self .errors
948
947
field_name = field_group [0 ].name .value
949
948
field_def = self .schema .get_field (parent_type , field_name )
950
949
if not field_def :
@@ -983,16 +982,26 @@ async def await_completed() -> Any:
983
982
try :
984
983
return await completed
985
984
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
+ )
988
992
self .filter_subsequent_payloads (path , async_payload_record )
989
993
return None
990
994
991
995
return await_completed ()
992
996
993
997
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
+ )
996
1005
self .filter_subsequent_payloads (path , async_payload_record )
997
1006
return None
998
1007
@@ -1026,6 +1035,28 @@ def build_resolve_info(
1026
1035
self .is_awaitable ,
1027
1036
)
1028
1037
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
<
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">+
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
+
1029
1060
def complete_value (
1030
1061
self ,
1031
1062
return_type : GraphQLOutputType ,
@@ -1138,11 +1169,9 @@ async def complete_awaitable_value(
1138
1169
if self .is_awaitable (completed ):
1139
1170
completed = await completed
1140
1171
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
1143
1174
)
1144
- error = located_error (raw_error , field_group , path .as_list ())
1145
- handle_field_error (error , return_type , errors )
1146
1175
self .filter_subsequent_payloads (path , async_payload_record )
1147
1176
completed = None
1148
1177
return completed
@@ -1198,7 +1227,6 @@ async def complete_async_iterator_value(
1198
1227
Complete an async iterator value by completing the result and calling
1199
1228
recursively until all the results are completed.
1200
1229
"""
A3E2
td>1201
- errors = async_payload_record .errors if async_payload_record else self .errors
1202
1230
stream = self .get_stream_values (field_group , path )
1203
1231
complete_list_item_value = self .complete_list_item_value
1204
1232
awaitable_indices : list [int ] = []
@@ -1236,14 +1264,14 @@ async def complete_async_iterator_value(
1236
1264
except StopAsyncIteration :
1237
1265
break
1238
1266
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
+ )
1241
1270
completed_results .append (None )
1242
1271
break
1243
1272
if complete_list_item_value (
1244
1273
value ,
1245
1274
completed_results ,
1246
- errors ,
1247
1275
item_type ,
1248
1276
field_group ,
1249
1277
info ,
@@ -1285,7 +1313,6 @@ def complete_list_value(
1285
1313
Complete a list value by completing each item in the list with the inner type.
1286
1314
"""
1287
1315
item_type = return_type .of_type
1288
- errors = async_payload_record .errors if async_payload_record else self .errors
1289
1316
1290
1317
if isinstance (result , AsyncIterable ):
1291
1318
iterator = result .__aiter__ ()
@@ -1336,7 +1363,6 @@ def complete_list_value(
1336
1363
if complete_list_item_value (
1337
1364
item ,
1338
1365
completed_results ,
1339
- errors ,
1340
1366
item_type ,
1341
1367
field_group ,
1342
1368
info ,
@@ -1370,7 +1396,6 @@ def complete_list_item_value(
1370
1396
self ,
1371
1397
item : Any ,
1372
1398
complete_results : list [Any ],
1373
- errors : list [GraphQLError ],
1374
1399
item_type : GraphQLOutputType ,
1375
1400
field_group : FieldGroup ,
1376
1401
info : GraphQLResolveInfo ,
@@ -1407,10 +1432,13 @@ async def await_completed() -> Any:
1407
1432
try :
1408
1433
return await completed_item
1409
1434
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 ,
1412
1441
)
1413
- handle_field_error (error , item_type , errors )
1414
1442
self .filter_subsequent_payloads (item_path , async_payload_record )
1415
1443
return None
1416
1444
@@ -1420,8 +1448,13 @@ async def await_completed() -> Any:
1420
1448
complete_results .append (completed_item )
1421
1449
1422
1450
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
+ )
1425
1458
self .filter_subsequent_payloads (item_path , async_payload_record )
1426
1459
complete_results .append (None )
1427
1460
@@ -1787,12 +1820,12 @@ async def await_completed_items() -> list[Any] | None:
1787
1820
try :
1788
1821
return [await completed_item ]
1789
1822
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 ,
1796
1829
)
1797
1830
self .filter_subsequent_payloads (
1798
1831
item_path , async_payload_record
@@ -1808,8 +1841,13 @@ async def await_completed_items() -> list[Any] | None:
1808
1841
completed_items = [completed_item ]
1809
1842
1810
1843
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
+ )
1813
1851
self .filter_subsequent_payloads (item_path , async_payload_record )
1814
1852
completed_items = [None ]
1815
1853
@@ -1850,8 +1888,9 @@ async def execute_stream_iterator_item(
1850
1888
raise StopAsyncIteration from raw_error
1851
1889
1852
1890
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
+ )
1855
1894
self .filter_subsequent_payloads (item_path , async_payload_record )
1856
1895
1857
1896
async def execute_stream_iterator (
@@ -2231,19 +2270,6 @@ def execute_sync(
2231
2270
return cast (ExecutionResult , result )
2232
2271
2233
2272
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
-
2247
2273
def invalid_return_type_error (
2248
2274
return_type : GraphQLObjectType , result : Any , field_group : FieldGroup
2249
2275
) -> GraphQLError :
0 commit comments