ایجاد custom exception handler

  • مدرس : علی بیگدلی
  • تاریخ انتشار: 1404/06/24
  • تعداد بازدید: 2

ایجاد 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 نیست.

ثبت دیدگاه


نکته: آدرس ایمیل شما منتشر نخواهد شد

دیدگاه کاربران (0)


هیچ دیدگاهی ثبت نشده است. می‌توانید اولین نفر باشید.