@@ -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-
22472273def invalid_return_type_error (
22482274 return_type : GraphQLObjectType , result : Any , field_group : FieldGroup
22492275) -> GraphQLError :
0 commit comments