背景
开发过程中经常会将通用的功能模块化,比如db操作封装为db_utils。那么问题来了,如果是在一个通用模块的处理中,出错了该如何处理。不同语言有不同的异常处理机制,比如golang和lua是将错误码和错误信息返回到上一层处理,但是python有更优雅的模式, 就是直接抛出异常
认识异常
1.常见的异常有Exception(常规错误的基类)、ZeroDivisionError(除零)、RuntimeError(一般的运行时错误)等,更多异常可以查看:https://www.runoob.com/python/python-exceptions.html
- 异常的捕获一般都是通过try...exception...else...finally...方式处理异常
- 自定义异常
实践
# 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
来源:oschina
链接:https://my.oschina.net/csp277/blog/3213856