例外
class CustomExcep(APIException):
def __init__(self, obj):
super(CustomExcep, self).__init__()
self.obj = obj
status_code = 202
default_detail = 'This already exists.{}'.format(self.obj)
default_code = 'accepted'
在序列化程序中
def duplicate_check(self):
if Person.objects.filter(name=name, age=age).exists():
raise CustomExcep('Person')
return True
错误:
<tr>
<th>Exception Type:</th>
<td>NameError</td>
</tr>
<tr>
<th>Exception Value:</th>
<td><pre>name 'self' is not defined</pre></td>
</tr>
这导致一般500错误而没有其他信息。 如果我删除 init 方法并且只是在不传递任何内容的情况下引发CustomExcep,则会按预期返回202.
我可以不将init用于异常类吗?
答案 0 :(得分:0)
TL; DR:您没有在__init__
当您举起APIException
时,会调用dunder方法__str__
。以下是DRF课程__init__
上__str__
和APIException
的声明:
class APIException(Exception):
"""
Base class for REST framework exceptions.
Subclasses should provide `.status_code` and `.default_detail` properties.
"""
status_code = status.HTTP_500_INTERNAL_SERVER_ERROR
default_detail = _('A server error occurred.')
default_code = 'error'
def __init__(self, detail=None, code=None):
if detail is None:
detail = self.default_detail
if code is None:
code = self.default_code
self.detail = _get_error_details(detail, code)
def __str__(self):
return six.text_type(self.detail)
如您所见,init方法设置self.detail
属性,该属性由__str__
引用。您看到500错误的原因是您的代码中存在内部服务器错误; self.detail
正在筹集AttributeError
。
将您的代码更改为:
class CustomExcep(APIException):
def __init__(self, obj):
super(CustomExcep, self).__init__()
... your code here
甚至更好;定义CustomExcep
如下:
class CustomExcep(APIException):
default_code = 202
default_detail = 'Instance already exists'
其他几个问题:
'Person'
而不是对象'Person'
__init__
的签名与__init__
班级中APIException
的基础签名不同。您的代码中存在污点问题,这应该是它的外观:
class CustomExcep(APIException):
status_code = 202
default_detail = 'This already exists.{}'.format(self.obj)
default_code = 'accepted'
def __init__(self, obj):
super(CustomExcep, self).__init__()
self.obj = obj
status_code
,default_detail
和default_code
是类属性,它们需要通过缩进嵌套在类声明中。