异常处理
异常处理在任何一门编程语言里都是值得关注的一个话题,良好的异常处理可以让你的程序更加健壮,清晰的错误信息更能帮助你快速修复问题。python中使用try except finally的结构来完成异常处理。
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x IOError 输入/输出异常;基本上是无法打开文件 ImportError 无法引入模块或包;基本上是路径问题或名称错误 IndentationError 语法错误(的子类) ;代码没有正确对齐 IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5] KeyError 试图访问字典里不存在的键 KeyboardInterrupt Ctrl+C被按下 NameError 使用一个还未被赋予对象的变量 SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了) TypeError 传入对象类型与要求的不符合 UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量, 导致你以为正在访问它 ValueError 传入一个调用者不期望的值,即使值的类型是正确的
def div(a, b): try: print(a/b) except ZeroDivisionError: print("Error:b should not be 0!!") except Exception as e: print('Unexcepted Error:{}'.format(e)) else: print('Evrything is ok!') finally: print('Always run into finally block!') div(2, 0) div(2, '123') div(1, 2)
def div2(a, b):
try:
print(a/b)
except (TypeError, ZeroDivisionError) as e:
print(e)
div(10,'100')
异常处理的一些规则:
except
语句不是必须的,finally
语句也不是必须的,但是二者必须要有一个,否则就没有try
的意义了。except
语句可以有多个,Python会按except
语句的顺序依次匹配你指定的异常,如果异常已经处理就不会再进入后面的except
语句。except
语句可以以元组形式同时指定多个异常,参见实例代码。except
语句后面如果不指定异常类型,则默认捕获所有异常,你可以通过logging或者sys模块获取当前异常。- 如果要捕获异常后要重复抛出,请使用
raise
,后面不要带任何参数或信息。 - 不建议捕获并抛出同一个异常,请考虑重构你的代码。
- 不建议在不清楚逻辑的情况下捕获所有异常,有可能你隐藏了很严重的问题。
- 尽量使用内置的异常处理语句来替换
try/except
语句,比如with
语句,getattr()
方法。