使用graphene-django-cud时Mutations无法抛出异常的问题求助
在graphene-django-cud的before_mutate/validate_*方法中抛出异常无报错信息,返回null的解决办法
问题场景
使用graphene-django-cud实现Mutations时,在before_mutate()或validate_*系列方法中抛出GraphQLError、ValueError或普通Exception,程序无报错信息直接终止,仅返回null实例和空消息。相关代码示例:
@classmethod def before_mutate(cls, root, info, input, id): print("before_mutate") from graphql import GraphQLError raise GraphQLError(f"The observation with id {id} doesn't exists") @classmethod def validate_name(cls, root, info, value, input, id, obj): print("validate_name") raise ValueError(f"The observation with id {id} doesn't existssss")
解决办法
1. 针对validate_*方法:使用Django的ValidationError替代ValueError
graphene-django对Django原生的ValidationError有完善的错误处理逻辑,能正确将错误信息返回给前端:
from django.core.exceptions import ValidationError @classmethod def validate_name(cls, root, info, value, input, id, obj): print("validate_name") raise ValidationError(f"The observation with id {id} doesn't existssss")
2. 针对before_mutate方法:确保GraphQLError被正确识别
- 避免在方法内部动态导入
GraphQLError,将导入语句放在文件顶部,防止运行时导入异常:
from graphql import GraphQLError @classmethod def before_mutate(cls, root, info, input, id): print("before_mutate") raise GraphQLError(f"The observation with id {id} doesn't exists")
- 检查项目中自定义的GraphQL错误中间件,确认没有错误捕获并吞掉这些异常,导致返回null。
3. 升级graphene-django-cud到最新稳定版
部分旧版本的graphene-django-cud存在异常处理逻辑缺陷,升级后可修复该问题:
pip install --upgrade graphene-django-cud
验证步骤
- 确认控制台能输出
before_mutate或validate_name,证明方法已被执行; - 查看Django或GraphQL的日志文件,排查是否有被吞掉的异常堆栈信息。
内容的提问来源于stack exchange,提问作者ZHICHEN GUO
相关产品推荐
相关产品推荐

