目录
1 什么是异常
异常是程序执行中发生的错误,不同于语法错误,能够在程序运行前就看到,异常通常是不可预见的。
x = 2 / 0
print(x)
print('运行完毕')
上面的代码看起来没有任何问题,IDE也没有错误提示,但运行后却出现了如下报错。
![](https://i-blog.csdnimg.cn/blog_migrate/94809991446995dd130845068caa8893.png)
原因在于除法运算中分母不能为0,否则会触发ZeroDivisionError异常。
2 为什么要处理异常
异常是一个对象,表示错误,如果程序执行时发生异常,不去处理就会导致程序意外终止。
在执行上面的代码时,程序结束前没有打印“运行完毕”,因为在执行第二行代码时触发了异常,程序到这里就结束了。
为了让程序顺利地执行完毕,我们需要捕获异常,处理完异常后,程序会继续运行。
3 如何处理异常
3.1 try-except语句
Python使用try-except语句捕获处理异常,try子句是可能发生异常的代码,except子句在发生异常后执行,是处理异常的代码。
except关键字后是要匹配的异常类型,只有try子句发生的异常与except语句的异常类型相匹配,except子句才会执行,对异常进行处理,异常处理完后,程序继续运行直到结束。
try:
x = 2/0
print(x)
except ZeroDivisionError:
print('Error:被除数不能为0')
print('运行完毕')
![](https://i-blog.csdnimg.cn/blog_migrate/a63dd8732643bd776fb1b2e5de1316b7.png)
如果发生异常时没有找到相应的异常处理程序,程序就会终止执行。
try:
x = 2/0
print(x)
except ValueError:
print('Error:被除数不能为0')
print('运行完毕')
![](https://i-blog.csdnimg.cn/blog_migrate/bc832b700a2ccaf48f529717f4b41912.png)
3.2 使用except但不带任何异常类型
当代码过于庞大时,由于异常的不可预见性,准确地预料可能发生的异常类型和数量,显然是不现实的。
更何况,要记住种类繁多的异常类型不是一件容易的事,也没有这个必要。
不知道可能发生的异常类型和数量,那怎样才能捕获异常呢?答案是——使用不带任何异常类型的except语句。
try:
x = 2/0
print(x)
except:
print('Error:发生异常')
print('运行完毕')
![](https://i-blog.csdnimg.cn/blog_migrate/2678bb24737beddee113236402898a85.png)
当except关键字后面不带任何异常类型时,发生异常时会捕获所有的异常类型。
但其缺点也是显而易见的——我们无法得知发生了什么类型的异常,也就无法作出相应的处理。
3.3 使用except且带多种异常类型
当可能发生多种异常,且无论发生哪一种异常,其处理程序都相同时,可以使用带多种异常类型的except语句。
try:
x = 2/0
print(x)
except (ZeroDivisionError,ValueError,IOError):
#发生以上异常的其中一种,即执行此处代码
print('Error:发生异常')
3.4 使用多个except语句
当可能发生多种异常,且要对每一种发生的异常作差别化处理时,可以使用多个except语句。
但需要注意的是,
try:
x = 2/0
print(x)
except ZeroDivisionError:
print('Error:被除数不能为0')
except ValueError:
print('Error:数值有误')
except IOError:
print('Error:输入有误')
3.5 else语句
有时我们会希望在没有发生异常的时候才执行某些代码,这时可以在except语句后面使用else语句,else子句只会在没有发生异常的情况下执行。
try:
x = 2 / 1
print(int(x))
except:
print('Error:发生异常')
else:
print('没有发生异常')
3.6 finally语句
和else语句只在没有异常时才执行不同,无论是否发生异常,finally语句都会执行。
try:
x = 2 / 0
print(int(x))
except:
print('Error:发生异常')
finally:
print('程序结束')
4 获取异常的特定信息
由于一个except语句可以处理多个异常,但如何得知处理的哪种异常呢?
事实上,每种异常类型都提供了几个属性和方法, 通过调用它们,可以获得当前处理异常的相关信息。
- args:返回异常的错误编号和描述字符串;
- str(e):返回异常信息,但不包括异常信息的类型;
- repr(e):返回较全的异常信息,包括异常信息的类型。
由于 except 可能接收多种异常,因此为了操作方便,可以直接给每一个进入到此 except 语句的异常,起一个统一的别名 e
try:
x = 2 / 0
print(int(x))
except(ZeroDivisionError,ValueError,IOError)as e:
print(e.args)
print(str(e))
print(repr(e))
![](https://i-blog.csdnimg.cn/blog_migrate/dedb73a2abb44b06643cbd1d80985ee3.png)