1 异常处理
1.1 try-except语句
异常发生时,剩余代码忽略,解释器搜索异常处理器,若没找到处理器,则将异常向上移交给调用者的try中去处理,直到找到合适的处理器。若到顶层仍未找到,则认为是未处理的异常,显示跟踪信息,然后退出。
因此,不需要在每个可能出错的地方去捕获错误,只要在合适的层次去捕获错误就可以了。
try-except语句1 | try-except语句——处理多个异常 |
try: try_suite #监控此处异常 except Exception1 [, reason1]: except_suite1 #异常处理器1 except Exception2 [, reason2]: except_suite2 #异常处理器2 | try: try_suite #监控此处异常 except (Exception1, Exception2...)[, reason]: [except_suite #异常处理器]
|
Exception2若是Exception1的子类,则无法捕获。
不要写【except:】来捕获所有异常。可以捕获特定异常并忽略它们, 或是捕获所有异常并采取特定的动作.
使用 pass 忽略某异常,会返回None。
1.2 异常参数reason
reason是一个元组,和异常类实例的args属性绑定。对于大多内建异常(从 StandardError 派生的异常), 这个元组只包含一个指示错误原因的字符串。
异常处理即使用pass忽略,reason也保留了异常信息。
调用str(reason)增加可读性(其实是调用类的__str__()方法),作为异常信息返回。
1.3 raise关键字
raise [Exception [, args [, traceback]]]
允许程序员强制抛出一个指定的异常。可以在except中重新抛出异常,供调用者处理。
raise Exception('error','xxx') 或 raise Exception, ('error','xxx')
#初始化一个异常类,多个参数接收为元组,传递给该对象的args属性。
执行raise语句时,Python会创建指定的异常类的一个对象。raise语句还可指定对异常对象进行初始化的参数。为此,在异常类的名称后添加一个逗号以及指定的参数(或者由参数构成的一个元组),即args。
1.4 异常继承关系
BaseException | Exception | 错误条件引起的异常 |
KeyboardInterrupt | 按下了 CTRL-C (^C) , 想要关闭 Python | |
SystemExit | 由于当前 Python 应用程序需要退出 | |
(all other current built-in exceptions) 所有当前内建异常 |
1.5 try的其它子句
1.5.1 else子句
在try 范围中没有异常被检测到时,执行else 子句。
1.5.2 try-finally语句
用来维持一致的行为。无论try中是否发生异常,finally都会执行。
当在try范围中产生一个异常时,会立即跳转到finally语句段.当finally中的所有代码都执行完毕后,会继续向上一层引发异常(finally 会自动的重新引发异常).
①可以嵌套语句:try(try-except)-finally,简化为try-except-finally
②或try(try-finally)-except来捕获finally中的异常(但是finally在异常处理之前执行,不是最后执行清理工作)
1.5.3 try-except-else-finally语句
1.6 with语句和上下文管理器
with context_expr [as var]: with_suite | with open('/etc/passwd', 'r') as f: for eachLine in f: # ...do stuff with eachLine or f... |
完成准备工作,若正常则把文件对象赋给f。无论是否发生异常,都会执行清理工作。
with所求值的对象必须是一个上下文管理器。
上下文管理器(Context Manager)是支持上下文管理协议的对象,这种对象实现了__enter__(self)和 __exit__(self,type,value,trace):
1.6.1 __enter__(self)方法
with后的上下文管理器调用__enter__()方法,如果使用了 as 子句,该方法的返回值赋给as后边的变量(可以是元组)。
1.6.2 __exit__(self,type,value,trace)
self:对象引用。type:异常类。value:异常信息。trace: 错误追踪。
当with后边代码执行完成后,不管是否执行过程中是否发生了异常,都会调用前边对象的__exit__()方法。
如果执行过程中没有出现异常,或者语句体中执行了语句 break/continue/return,则以 None 作为参数调用__exit__(None, None, None) ;如果执行过程中出现异常,则使用 sys.exc_info 得到的异常信息为参数调用__exit__(exc_type, exc_value, exc_traceback)
如果 __exit__() 返回 True,则异常被忽略,如果返回False,则重新抛出异常,由外层代码对异常进行处理。
1.6.3 相关模块contextlib
为使用with 语句的上下文对象工具
1.7 自定义异常
classMyError(Exception):
def __init__(self,val):
self.myVal=val
def __str__(self):
return repr(self.value)
raiseMyError('error')
1.8 断言assert
assert expression[, arguments]
# 若表达式expression不成立,则引发AssertionError异常,输出arguments信息。
可将assert语句放在try语句块中。