python|python 异常之捕获、处理

在Python无法正常处理程序时就会发生一个异常,程序就会停止运行,将异常信息抛出。
如下,当代码执行到除0的时候,0不能当作被除数,这时出现异常,后面代码就不会再执行。
python|python 异常之捕获、处理
文章图片

如果发生异常时不想结束程序,可以用try…except去捕获异常,然后处理异常,让程序继续执行。
try…except的语法:

try: 有可能出现异常的代码 expect 异常信息: 出现异常时要运行的代码

再来看除0的例子:
python|python 异常之捕获、处理
文章图片

当然如果不会出现异常的代码放到try中就没有意义了。
python|python 异常之捕获、处理
文章图片

并且如果try中一旦出现异常,就会立即调用except子句,try中剩下的代码不会再执行。
python|python 异常之捕获、处理
文章图片

会不会出现异常需要自己去判断。当然也可以每行代码都加try,那估计自己看代码的时候都会眼花。
用except默认是捕获到所有的异常,但是无法准确的定位到程序出现了什么异常,所以可以指定可能出现的异常信息;如图常见的异常类型。
python|python 异常之捕获、处理
文章图片

需要再except 后面加上异常信息,如下指定了IndexError异常:
python|python 异常之捕获、处理
文章图片

但是引发的异常需要与定义的异常信息匹配,否则捕获不到异常信息。
python|python 异常之捕获、处理
文章图片

也可以捕获多种异常,有两种方式:
第一种 :在except后面加多个异常信息(个人感觉这样与默认except没什么区别。)
python|python 异常之捕获、处理
文章图片

第二种:多个except 定义异常,如果发生异常,会先与第一个except定义的异常匹配,匹配失败会跳到下一个except匹配,匹配成功则执行except中的代码。
python|python 异常之捕获、处理
文章图片

当然如果都没有匹配成功就会抛出异常:
python|python 异常之捕获、处理
文章图片

也可以把捕获的异常信息赋值给一个变量,这样也可以捕获到所有异常,并且可以输出异常信息。语法如下:
python|python 异常之捕获、处理
文章图片

如果想得到更详细的异常信息,比如在哪个文件哪个函数哪一行可以import traceback模块。常用的两个方法format_exc()与print_exc()。
format_exc():返回字符串
python|python 异常之捕获、处理
文章图片

print_exc():直接将结果打印出来
python|python 异常之捕获、处理
文章图片

try…except…finally语句,无论是否发生异常都将执行finally中的代码。
python|python 异常之捕获、处理
文章图片

try…except…else语句,没有异常时将会执行else中的代码
python|python 异常之捕获、处理
文章图片

else与finally结合使用,需要注意的是finally一定要放在最后。
python|python 异常之捕获、处理
文章图片

【python|python 异常之捕获、处理】raise :手动抛出异常,任何场景都可以用
python|python 异常之捕获、处理
文章图片

最后提个小醒 SyntaxError 语法错误是不能被捕获的:
python|python 异常之捕获、处理
文章图片

    推荐阅读