Обработка исключений Python graphql
Согласно документации в https://www.howtographql.com/graphql-python/6-error-handling/ я использую raise GraphQLError
чтобы показать ошибки в моих функциях мутирования в приложении Flask GraphQL, например:
import graphene
from graphql import GraphQLError
from ...extensions import db
from ...models import User as UserModel
from ..types import User as UserType
class Update(graphene.Mutation):
class Input:
id = graphene.ID(required=True)
# phone = graphene.String()
name = graphene.String(required=False, default_value=None)
# active = graphene.Boolean()
Output = UserType
@staticmethod
def mutate(root, info, **kwargs):
user = graphene.Node.get_node_from_global_id(info, kwargs.pop('id'))
# print(info.context)
# if not user:
raise GraphQLError('eeee')
# user.update(**kwargs)
# db.session.commit()
return user
Я ожидаю получить что-то вроде кода состояния 400 с jq-схемой graphql error. Но я получаю 200, а также исключение печатается в консоли с traceback. Я что-то здесь не так делаю?
An error occurred while resolving field Mutation.updateUser
Traceback (most recent call last):
File "/.local/share/virtualenvs/Server-CvYlbWSB/lib/python3.7/site-packages/graphql/execution/executor.py", line 447, in resolve_or_error
return executor.execute(resolve_fn, source, info, **args)
File "/.local/share/virtualenvs/Server-CvYlbWSB/lib/python3.7/site-packages/graphql/execution/executors/sync.py", line 16, in execute
return fn(*args, **kwargs)
File "/application/schema/mutation/user.py", line 40, in mutate
raise GraphQLError('eeee')
graphql.error.base.GraphQLError: eeee
Traceback (most recent call last):
File "/.local/share/virtualenvs/Server-CvYlbWSB/lib/python3.7/site-packages/graphql/execution/executor.py", line 447, in resolve_or_error
return executor.execute(resolve_fn, source, info, **args)
File "/.local/share/virtualenvs/Server-CvYlbWSB/lib/python3.7/site-packages/graphql/execution/executors/sync.py", line 16, in execute
return fn(*args, **kwargs)
File "/application/schema/mutation/user.py", line 40, in mutate
raise GraphQLError('eeee')
graphql.error.located_error.GraphQLLocatedError: eeee
127.0.0.1 - - [17/Oct/2018 01:46:54] "POST /graphql? HTTP/1.1" 200 -
1 ответ
Похоже, что преднамеренно показана трассировка стека. Вы можете просмотреть обсуждение на GitHub. На случай, если связь прекратится, основа обсуждения заключалась в том, что graphql-core
библиотека по существу съела бы все ошибки, выброшенные графеном, и поместила бы их в results.errors
массив без печати трассировки стека в sys.stderr
, Как правило, это нежелательное поведение, и, таким образом, похоже, что оно было изменено в запросе на удаление.
Если вы все еще хотите имитировать такое поведение, вы можете просмотреть ответ Stackru, чтобы избавиться от трассировки стека: вы можете отключить трассировку , ограничив ее глубину. Это все еще должно появиться в results.errors
сюда; однако обратите внимание, что это все еще печатает сообщение об ошибке на консоли, но не печатает трассировку стека.
Если вы хотите полностью избавиться от ошибки и трассировки стека на консоли (я не рекомендую этого), вам нужно будет перехватить исключение где-нибудь в приложении за пределами средства разрешения мутаций, чтобы ошибка все еще отображалась в results.errors
массив. Например, вы можете сделать это при первом запуске приложения Flask (хотя область действия может быть слишком большой в этом случае).
try:
app = Flask(__name__)
except GraphQLError as gqle:
pass # ignore the error
except OtherErrorYouManuallyCall as oeymc:
pass
# Any other error will be thrown and show the stack trace