Обработка исключений 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 со схемой json ошибки graphql. Но я получаю 200, а также исключение печатается в консоли с трассировкой. Я делаю что-то не так здесь?

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 - 

person hamidfzm    schedule 16.10.2018    source источник


Ответы (1)


Кажется, намеренно показана трассировка стека. Вы можете просмотреть обсуждение на GitHub. На случай, если ссылка прервется, основная дискуссия заключалась в том, что библиотека graphql-core, по сути, съест все ошибки, выдаваемые графеном, и поместит их в массив results.errors без печати трассировки стека в sys.stderr. Как правило, это нежелательное поведение, и поэтому кажется, что оно было изменено в запросе на включение.


Если вы все еще хотите имитировать это поведение, вы можете просмотреть этот ответ StackOverflow, чтобы избавиться от трассировки стека: Вы можете отключить трассировку, ограничение его глубины. Таким образом, он все еще должен отображаться в 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
person Tobe E    schedule 18.10.2018
comment
Похоже, что graphql не различает ожидаемые ошибки клиента и неожиданные ошибки сервера. Я также заметил, что Sentry улавливает банальные ошибки graphql, даже такие, как пользователь не аутентифицирован, и сообщает о них как о сбоях. - person Ken Kinder; 24.06.2020