python优雅处理异常

编程

背景

开发过程中经常会将通用的功能模块化,比如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

以上是 python优雅处理异常 的全部内容, 来源链接: utcz.com/z/514890.html

回到顶部