要启用更好的错误跟踪,我想为任何意外错误生成自定义ID并将其公开给api调用者。为此,我编写了一个自定义ErrorMixin
(其中graylogger
是一个记录器,它通过ip将日志数据作为json发送到logserver):
class UnknownError(APIException):
status_code = 500
class ErrorMixin(object):
def dispatch(self, *args, **kwargs):
try:
return super(ErrorMixin, self).dispatch(*args, **kwargs)
except APIException as e:
# catches known errors
raise e
except Exception as e:
uuid = get_uuid()
graylogger.error("{uid: {}, traceback: {} }".format(uuid, traceback.extract_stack())
raise UnknownError(detail=uuid)
问题是: 在我做之前,Django以某种方式捕获错误:
我的期望:
{"uid": "123-123-123-123": "msg": "... stacktrace ... "}
我得到的是:
非调试模式下的默认django 500页面和调试模式下的django stacktrace页面。
你能解释一下,为什么?
答案 0 :(得分:0)
解决方案是:以下列方式覆盖handle_exception
方法:
class ErrorMixin(object):
def handle_exception(self, e):
if isinstance(e, APIException):
return super(ErrorMixin, self).handle_exception(e)
else:
uuid = get_uuid()
return super(ErrorMixin, self).handle_exception(
UnknownError(detail=uuid))