Django笔记三十一之全局异常处理

科技资讯 投稿 24500 0 评论

Django笔记三十一之全局异常处理

原文链接:Django笔记三十一之全局异常处理

当我们在处理一个 request 请求时,会尽可能的对接口数据的格式,内部调用的函数做一些异常处理,但可能还是会有一些意想不到的漏网之鱼,造成程序的异常导致不能正常运行,甚至会直接报给前端一个错误。

这里我们会用 Django 的中间件和日志的处理来实现,在本系列文章的第二十九篇和第三十篇,可以先熟悉下这两部分功能的使用。

__call__( 和 process_view( 函数,其实还有一个 process_exception( 函数,这个函数就是当我们的请求在发生不可预知的报错的情况下,会自动调用的函数。

# hunter/middlewares/exception_middleware.py

import traceback
from django.http import JsonResponse
import logging

logger = logging.getLogger(__name__


class ExceptionMiddleware:

    def __init__(self, get_response:
        self.get_response = get_response

    def __call__(self, request:
        response = self.get_response(request
        return response

    def process_exception(self, request, exception:

        traceback_info = traceback.format_exc(
        logger.info(f"request_path: {request.path}, traceback_info: {traceback_info}"
        return JsonResponse({"code": -1, "msg": "error"}, status=500

在这里,我们使用 traceback.format_exc( 函数获取到 exception 的报错信息,然后通过 logger 日志打印输出。

日志信息

记录之后,后端就可以通过日志的具体信息去查看到底是哪里出了问题。

返回报错

调用中间件

'hunter.middlewares.exception_middleware.ExceptionMiddleware', 这一条。

# hunter/settings.py

MIDDLEWARE = [
    ...
    'hunter.middlewares.exception_middleware.ExceptionMiddleware',
]

测试报错

# blog/views.py

from django.http import HttpResponse, JsonResponse

def time_view(request:
    html = "<h2>abc</h2>"
    1 / 0
    return HttpResponse(html

然后在页面或者 postman 里调用该接口,就可以在 logger 指定的日志文件里看到关于这一行的具体报错信息啦。

如果想获取更多后端相关文章,可扫码关注阅读:

编程笔记 » Django笔记三十一之全局异常处理

赞同 (132) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽