首页 > 编程笔记

Python异常处理(try except finally)

在编写程序的过程中人们可能因为不熟悉语法、误用语句或设计逻辑有误而造成程序出错(异常),程序运行中碰到这些情况就会造成程序终止。

Python 允许我们捕捉异常的错误类型,并允许自行编写异常处理程序,当异常被捕捉时就会去执行异常处理程序,接着程序仍可继续执行。

本文将讨论 Python 程序设计时的错误种类与异常处理。

认识异常

异常是指程序执行时产生了“不可预期”的错误,这时 Python 解释器会接手处理异常,发出错误信息,并将程序终止。也就是说,好的程序必须考虑到可能发生的异常,并拦截下来加以适当的处理。

例如,两数进行相除时,除数不可以为 0,如果没有编写异常处理的程序代码,当除数不小心被输入 0 时,就会发生除 0 的错误信息,并造成程序的中断,这当然不是一种好的处理方式。

下面就先从发生除 0 错误的例子进行讲解。

【示例1】除 0 错误。python代码如下:
a=int(input('请输入被除数:'))
b=int(input('请输入除数:'))
print(a/b)
输出结果:

请输入被除数:8
请输入除数:2
4.0

发生异常的结果:

请输入被除数: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…finally实例演练

以【示例1】为例,一旦不小心除数输入为 0,系统就会捕捉到这个错误。当捕捉到除 0 错误时,产生的异常类型为“ZeroDivisionError”,然后输出错误信息。

【示例2】在发生除 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 所示。

表1 常见异常类型及说明
异常类型 说明
FileNotFoundError 找不到文件的错误
NameError 名称未定义的错误
ZeroDivisionError 除0错误
ValueError 使用内置函数时,参数中的类型正确,但值不正确的错误
TypeError 类型不符的错误
MemoryError 内存不足的错误

下面的程序示例要求用户输入总业绩和业务员人数,然后计算全体业务人员的平均销售业绩。为了避免错误输入行为,可以根据不同的异常情况加入异常处理程序。

【示例3】在计算平均值的程序中加入异常处理。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'",)
最后一定要执行的程序块

程序解说:

优秀文章