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