Python异常处理(超详细)

Python异常处理(超详细)

0761

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

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语句内的程序代码。

© 版权声明
THE END
喜欢就支持一下吧
点赞1赞赏
分享
评论 抢沙发
HarryPotter的头像|艾奇编程网

昵称

取消
昵称表情