Django自定义错误处理

时间:2015-12-14 14:02:30

标签: django django-rest-framework

要启用更好的错误跟踪,我想为任何意外错误生成自定义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页面。

你能解释一下,为什么?

1 个答案:

答案 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))