python优雅处理异常

落爺英雄遲暮 提交于 2020-04-06 05:27:03

背景

开发过程中经常会将通用的功能模块化,比如db操作封装为db_utils。那么问题来了,如果是在一个通用模块的处理中,出错了该如何处理。不同语言有不同的异常处理机制,比如golang和lua是将错误码和错误信息返回到上一层处理,但是python有更优雅的模式, 就是直接抛出异常

认识异常

1.常见的异常有Exception(常规错误的基类)、ZeroDivisionError(除零)、RuntimeError(一般的运行时错误)等,更多异常可以查看:https://www.runoob.com/python/python-exceptions.html

  1. 异常的捕获一般都是通过try...exception...else...finally...方式处理异常
  2. 自定义异常

实践

# coding: utf-8

import sys

reload(sys)
sys.setdefaultencoding('utf-8')


class MyError(Exception):
    def __init__(self, value):
        self.value = value

    def __str__(self):
        return repr(self.value)


def create_error(name):
    if len(name) > 5:
        raise MyError('name of item is too long')
    elif len(name) > 0:
        raise Exception(u"抛出一个Exception异常")
    else:
        raise RuntimeError(u"抛出一个RuntimeError异常")
    return name + " is created!"


def raise_my_err_test(name='sharpen'):
    try:
        create_error(name)
    except MyError as e:
        print('caught my error, error= %s' % str(e).decode('utf-8'))
        print str(e).decode('unicode_escape')
    except Exception as e:
        print 'cat exception error = ', e


def error():
    raise ValueError('oops!')


def catch_error_modify_message():
    try:
        error()
    except ValueError:
        print 'Caught!'
        error_type, error_instance, traceback = sys.exc_info()
        error_instance.args = (error_instance.args[0] + ' <modification>',)
        raise error_type, error_instance, traceback


if __name__ == '__main__':
    raise_my_err_test()



总结

1.通过抛出异常的方式表达错误更Pythonic, 看具体的使用场景,如果出现异常需要返回然后终结的场景,则不必层层网上传递和判断,直接向上层抛出异常的方式。

2.抛出异常可以在捕获的逻辑里进行记录处理,然后通过raise继续向上抛出异常

参考

https://www.runoob.com/python/python-exceptions.html

https://docs.python.org/zh-cn/2.7/tutorial/errors.html

https://stackoverflow.com/questions/2052390/manually-raising-throwing-an-exception-in-python

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!