ایجاد Custom Exception Handler برای GraphQL در FastAPI و Strawberry
در Strawberry میتوانیم یک Handler سفارشی تعریف کنیم تا تمام Exceptionها را کنترل کنیم و پیام خطا را به شکل دلخواه به پاسخ GraphQL اضافه کنیم. این روش باعث میشود پیامهای خطا یکدست و قابل مدیریت باشند.
# graphql/exceptions.py
import strawberry
from strawberry.types import Info
class GraphQLException(Exception):
def __init__(self, message: str):
self.message = message
def graphql_exception_handler(exception: Exception, info: Info):
# اینجا میتوانیم انواع Exceptionها را بررسی و پیام سفارشی بسازیم
if isinstance(exception, GraphQLException):
return strawberry.types.ExecutionResult(
data=None,
errors=[strawberry.types.GraphQLError(message=exception.message)]
)
# برای سایر Exceptionها
return strawberry.types.ExecutionResult(
data=None,
errors=[strawberry.types.GraphQLError(message="Internal server error")]
)
اتصال Handler به Schema
# schema.py
import strawberry
from graphql.users import UserQuery, UserMutation
from graphql.tasks import TaskQuery, TaskMutation
from graphql.exceptions import graphql_exception_handler
@strawberry.type
class Query(UserQuery, TaskQuery):
pass
@strawberry.type
class Mutation(UserMutation, TaskMutation):
pass
schema = strawberry.Schema(
query=Query,
mutation=Mutation,
extensions=[strawberry.extensions.ErrorHandlerExtension(handler=graphql_exception_handler)]
)
توضیح
- کلاس
GraphQLException
برای خطاهای سفارشی پروژه تعریف شد. - تابع
graphql_exception_handler
بررسی میکند که اگر Exception از نوع سفارشی بود پیام مناسب برگردانده شود و برای سایر خطاها پیام عمومی داده شود. - در هنگام ساخت Schema، این Handler به عنوان
ErrorHandlerExtension
به Schema اضافه میشود. - مزیت: تمام خطاها به شکل استاندارد و قابل کنترل در پاسخ GraphQL بازگردانده میشوند و نیازی به نوشتن try/except در هر Resolver نیست.