在编写程序的过程中人们可能因为不熟悉语法、误用语句或设计逻辑有误而造成程序出错(异常),程序运行中碰到这些情况就会造成程序终止。
Python 允许我们捕捉异常的错误类型,并允许自行编写异常处理程序,当异常被捕捉时就会去执行异常处理程序,接着程序仍可继续执行。本文将讨论 Python 程序设计时的错误种类与异常处理。
认识异常
异常是指程序执行时产生了“不可预期”的错误,这时 Python 解释器会接手处理异常,发出错误信息,并将程序终止。也就是说,好的程序必须考虑到可能发生的异常,并拦截下来加以适当的处理。
例如,两数进行相除时,除数不可以为 0,如果没有编写异常处理的程序代码,当除数不小心被输入 0 时,就会发生除 0 的错误信息,并造成程序的中断,这当然不是一种好的处理方式。
下面就先从发生除 0 错误的例子进行讲解。
示例:除 0 错误。python代码如下:
a=int(input('请输入被除数:'))
b=int(input('请输入除数:'))
print(a/b)
输出结果:
请输入被除数:4
请输入除数:0
Traceback (most recent call last):
File "C:\Users\27580\Desktop\2.py", line 3, in <module>
print(a/b)
ZeroDivisionError: division by zero
从上面的例子可以看出,当程序发生异常时会出现错误信息,程序强迫终止执行。
try..except..finally
在 Python 中要捕捉异常及设计异常处理程序,就必须使用try…except…finally
语句,其语法格式如下。
try:
可能发生异常的语句
except 异常类型:
# 针对错误类型1,对应的代码处理
except异常类型: #只处理所示的异常
处理状况一
except (异常类型1, 异常类型2, …):
处理状况二
except异常类型as 名称:
处理状况三
except : #处理所有异常情形
处理状况四
else :
#未发生异常的处理
finally :
# 无论是否有异常,都会执行的finally语句代码
语法格式说明:
- try 语句后要有冒号
:
来形成程序块,并在此加入引发异常的语句。 - except 语句配合异常类型来截取或捕捉 try 语句区段内引发异常的处理。同样地,except 语句之后要用冒号
:
形成程序块。 - else 语句则是未发生异常时所对应的程序块。else 语句为选择性语句,可以加入也可以省略。
- 无论有无异常引发,finally 语句所形成的程序块一定会被执行。finally 语句为选择性语句,可以加入也可以省略。
实例演练
以【示例1】为例,一旦不小心除数输入为 0,系统就会捕捉到这个错误。当捕捉到除 0 错误时,产生的异常类型为“ZeroDivisionError”,然后输出错误信息。
示例:在发生除 0 错误时加入异常处理机制。python代码如下:
def check(a,b):
try:
return a/b
except ZeroDivisionError: #除数为0的处理程序
print('除数不可为0')
a=int(input('请输入被除数:'))
b=int(input('请输入除数:'))
print(check(a,b))
正确的输出结果:
请输入被除数:8
请输入除数:2
4.0
捕捉到异常的输出结果:
请输入被除数:8
请输入除数:0
除数不可为0
None
从上述执行结果来看,当发生异常时,出现的错误信息会根据用户自己所要求的内容输出,而且不会发生程序中断的情况。
try..except指定异常类型
如果希望捕捉到的异常类型能更精确,除了前面列举的除 0 错误外,下面还列举了几种常见的异常类型,如表 1 所示。
异常类型 | 说明 |
---|---|
FileNotFoundError | 找不到文件的错误 |
NameError | 名称未定义的错误 |
ZeroDivisionError | 除0错误 |
ValueError | 使用内置函数时,参数中的类型正确,但值不正确的错误 |
TypeError | 类型不符的错误 |
MemoryError | 内存不足的错误 |
下面的程序示例要求用户输入总业绩和业务员人数,然后计算全体业务人员的平均销售业绩。为了避免错误输入行为,可以根据不同的异常情况加入异常处理程序。
示例:在计算平均值的程序中加入异常处理。python代码如下:
try:
money=int(input("请输入总业绩: "))
no=int(input("请输入有多少位业务人员: "))
average_sales=money/no
except ZeroDivisionError:
print("人数不可以为0")
except Exception as e1:
print("错误信息",e1.args)
else:
print("全体业务人员平均业绩= ", average_sales)
finally:
print("最后一定要执行的程序块")
没有发生异常的执行结果:
请输入总业绩: 200000
请输入有多少位业务人员: 5
全体业务人员平均业绩= 40000.0
最后一定要执行的程序块
捕捉到除 0 错误的异常的执行结果:
请输入总业绩: 200000
请输入有多少位业务人员: 0
人数不可以为0
最后一定要执行的程序块
捕捉到异常的错误信息:
请输入总业绩: 200000
请输入有多少位业务人员: p
错误信息 (“invalid literal for int() with base 10: ‘p'”,)
最后一定要执行的程序块
程序解说:
- 第 5~6 行:程序中使用了 except 语句来捕捉除 0 错误的异常。
- 第 7~8 行:如果程序捕捉到其他异常,则输出此异常的相关信息。
- 第 9~10 行:没有发生异常时,则会直接执行 else 语句内的程序代码。
- 第 11~12 行:无论有无发生异常,当要离开 try…except 时,都会执行
finally
语句内的程序代码。