电子书 当前页面的脚本发生错误 异常处理的三个好习惯 | Python 工匠

11/28 05:09:02 来源网站:辅助卡盟网

"""

def __init__(self, captures, code_name):

self.captures = captures

self.code = getattr(error_codes, code_name)


def __enter__(self):

# 该方法将在进入上下文时调用

return self


def __exit__(self, exc_type, exc_val, exc_tb):

# 该方法将在退出上下文时调用

# exc_type, exc_val, exc_tb 分别表示该上下文内抛出的

# 异常类型、异常值、错误栈

if exc_type is None:

return False


if exc_type == self.captures:

raise self.code from exc_val

return False

在上面的代码里,我们定义了一个名为 raise_api_error 的上下文管理器,它在进入上下文时什么也不做。但是在退出上下文时,会判断当前上下文中是否抛出了类型为 self.captures 的异常,如果有,就用 APIErrorCode 异常类替代它。

使用该上下文管理器后,整个函数可以变得更清晰简洁:

  1. def upload_avatar(request):

    """用户上传新头像"""

    with raise_api_error(KeyError, 'AVATAR_FILE_NOT_PROVIDED'):

    avatar_file = request.FILES['avatar']


    with raise_api_error(ResizeAvatarError, 'AVATAR_FILE_INVALID'),\

    raise_api_error(FileTooLargeError, 'AVATAR_FILE_TOO_LARGE'):

    resized_avatar_file = resize_avatar(avatar_file)


    with raise_api_error(Exception, 'INTERNAL_SERVER_ERROR'):

    request.user.avatar = resized_avatar_file

    request.user.save()

    return HttpResponse({})

    Hint:建议阅读 PEP 343 -- The "with" Statement | Python.org,了解与上下文管理器有关的更多知识。

    模块 contextlib 也提供了非常多与编写上下文管理器相关的工具函数与样例。

    总结

    在这篇文章中,我分享了与异常处理相关的三个建议。最后再总结一下要点:

    看完文章的你,有没有什么想吐槽的?请留言或者在 项目 Github Issues 告诉我吧。

    -- 完 --

    本文经作者授权发布,如需转载,请联系原作者。

    来源:【九爱网址导航www.fuzhukm.com】 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    暂无相关资讯
电子书 当前页面的脚本发生错误 异常处理的三个好习惯 | Python 工匠