1. try…except结构
异常处理结构中最常见也最基本的结构。其中try子句中的代码块包含可能出现的语句,而except子句用来不做相应的异常,except子句中的代码块用来处理异常。如果try中的代码块没有出现异常,则继续往下执行异常处理结构后面的代码;如果出现异常并且被except子句捕获,则执行except子句中的异常处理代码;如果出现异常单没有被except捕获,则继续往外层抛出;如果所有层都没有捕获并处理该异常,则程序终止并将该异常抛给最终用户。语法结构如下:
try:
try块
except Exception[as reason]:
exception块
如果要捕获所有类型异常,可以使用BaseException,即Python异常类的基类,代码格式如下:
try:
…
except BaseException as e:
exception块
2. try …except…else结构
带else子句的异常处理结构是一种特殊形式的选择结构。如果try中的代码抛出了异常,并且被某个except捕获,则执行相应的异常处理代码,这种情况下不会执行else中的代码,依赖于try代码块成功执行的代码都应该放到else代码块中;如果try中的代码没有抛出任何异常,则执行else块中的代码。
工作原理:Python尝试执行try代码块中的代码;只有可能引发异常的代码才需要放在try语句中。有时候,有一些仅在try代码块成功执行时才需要运行的代码,这些代码应放在else代码块中。except代码块告诉Python,如果他尝试运行try代码块中的代码时引发了指定的异常,该怎么办。通过预测可能发生错误的代码,可编写健壮的程序,它们即使面临无效数据或缺少资源,也能继续运行,从而能抵御无意的影虎错误和恶意的攻击。
3. 带有多个except的try结构
在实际开发中,同一段代码可能会抛出多个异常,需要针对不同异常类型进行相应的处理。为了支持多个异常的捕捉和处理,Python提供了带有过个except的异常处理结构,类似于多分支选择结构。一旦某个except捕获了异常,则后面剩余的except子句将不会再执行。
将要捕获的异常卸载一个元组中,可以使用一个except语句捕获多个异常,并且共用同一段异常处理代码,当然,除非确定要捕获的多个异常可以使用同一段代码来处理,否则并不建议这样做。
4. try…except…finally结构
该结构指那个,finally自剧中的语句块无论是否发生异常都会执行,常用来做一些清理工作以释放try自剧中申请的资源。
需要注意的问题是,如果try子句中的异常没有被捕获和处理,或者except子句或else子句中的代码出现了异常,那么这些异常将会在finally子句执行完成后再次抛出。finally中的代码也可能会抛出异常,使用带有finally子句的异常处理结构时,应尽量避免在子句中使用return语句,否则可能会出现出乎意料的错误。
5. 断言
Python在unittest.TestCase类中提过了很多断言的方法。断言方法检查你认为该满足的条件是否确实满足。如果不满足Python将引发异常。
语法:
assert expression[,reason]
assert语句一般用于对程序某个时刻必须满足的条件进行验证,仅当”debug” 为True时有效。当PYthon脚本以_()选项编译为字节码文件是,assert语句将被移除以提高运行速度。
6. 上下文管理
使用上下文管理语句with可以自动管理资源,在代码块执行完毕后自动还原进入改代码块之前的现场或上下文。不论何种原因跳出with块,也不论是否发生异常,总能保证资源被正确释放,大大简化了程序员的工作,常用于文件操作、网络通信之类的场合。
with语句的语法如下:
with context_expr [as var]:
with块
7. 用sys模块回溯最后的异常
当发生异常时Python会回溯异常,给出大量的提示,可能会给程序员的定位和纠错带来一定的困难,这是可以使用sys模块回溯最近一次异常。语法为:
import sys
try:
block
except:
t==sys.exc_info()
print(t)
sys.exc_info()返回值是一个三元组(type,value/message,traceback)。其中,type表示异常的类型,value/message表示异常的信息或者参数,而traceback则包含调用栈信息的对象。
sys.exc_info()可以直接定位最终引发异常的原因,结果比较简洁,但是缺点是难以直接确定引发异常的代码位置