Python异常处理函数:如何使用try-except语句来处理异常
Python是一种解释性的、面向对象的高级编程语言,其灵活、易于学习、编写和阅读的特点造就了它在众多编程语言中的高人气。当程序在运行时遇到不可预料的错误(如输入不合法、除数为0、不支持的操作等),就会抛出异常并停止执行。如果遇到异常而没有进行处理,程序不仅无法继续执行,还会抛出一些不友好的错误信息,给用户带来不好的体验。因此,一种好的程序设计应该在可能出现异常的地方进行捕获、处理,避免不必要的停机,同时给出更友好的错误提示,增强程序的健壮性和可读性。那么,如何使用try-except语句来处理异常呢?
一、异常处理的基本语法
Python的异常处理语法就是使用try-except语句块来实现的。try语句用于包含可能引发异常的代码块,except语句用于捕获try语句块中的异常,当程序运行到try块中引发异常时,就会自动跳转到相应的except块进行处理,从而保证了程序的健壮性。
try:
#某段代码可能会产生异常
except ExceptionType as e:
#异常处理代码
其中try语句块是需要进行异常处理的代码段,若其中存在某种异常,则执行该代码段的程序就会在相应异常位置抛出该异常;except语句块是在遇到异常时进行的处理,其中ExceptionType为需要捕获的异常类型,e为在捕获异常时给出的异常对象(异常对象包含有关错误的信息,包括错误类型和错误原因)。
二、异常处理的基本流程
Python异常处理的基本流程如下:
1、Python运行代码,当try语句块中的代码引发异常时,检查该异常类型是否与except语句中指定的异常类型匹配;
2、如果匹配,则执行该except语句块,完成异常处理操作;若没有匹配到异常类型,则异常依然会继续向上层程序传递,直到遇到了上层的try语句块或者程序挂起。
下面是一个简单的异常处理示例:
try:
a = input("请输入一个整数:")
b = input("请输入另一个整数")
result = int(a) / int(b)
print(result)
except ValueError as e:
print("输入不合法,请重新输入合法整数!");
except ZeroDivisionError as e:
print("除数不能为0,请重新输入另一个整数!");
以上代码中, 行让用户输入一个整数a,第二行让用户输入另一个整数b。如果b为0,则抛出ZeroDivisionError异常,如果a、b不是整数,则抛出ValueError异常。在代码的第6行,我们用 int(a) / int(b) 计算了a/b的值,并将其输出,但如果输入的a、b不是整数或者b为0,会导致程序抛异常而无法执行下去。此时,程序就会跳转到相应的异常处理语句块中(即12行或14行),给出相应的提示信息,增强程序的健壮性和可读性。
三、异常处理的多重捕获
当程序中同时存在多种异常时,要对每种异常进行相应的处理。try语句块和except语句块可以组合成多个子块,支持多重捕获,如下所示:
try:
#某段代码可能会产生异常1
except ExceptionType1 as e1:
# 种异常类型代码块
except ExceptionType2 as e2:
#第二种异常类型代码块
except ExceptionType3 as e3:
#第三种异常类型代码块
else:
#当try语句块中的代码执行无异常时执行该代码块
finally:
#无论是在try语句块中还是在except语句块中都会执行的代码块
如上代码,有3种异常类型ExceptionType1、ExceptionType2、ExceptionType3需要处理。如果出现异常1,则执行 种异常类型代码块;如果出现异常2,则执行第二种异常类型代码块;如果出现异常3,则执行第三种异常类型代码块;如果以上都没有捕获到异常,则执行else中的代码块;无论这段代码中是否引起异常,finally子句中的代码块都会在最后执行。
四、异常处理的高级用法
异常处理的高级用法包括自定义异常、异常链、异常清理等。其中,自定义异常可以方便地识别多种异常类型,异常链可以追踪异常的传递路径,异常清理可以在异常发生时进行资源或其他清理操作。
【1】自定义异常
Python的标准库中提供了很多类异常,但在某些情况下,需要更加具体地描述异常的原因。这时,我们可以自定义异常来满足自己的需求。创建自定义异常的方式如下:
class MyException(Exception):
def __init__(self, message):
self.message = message
其中MyException为自定义异常的类名,该类继承了父类Exception。在构造函数中使用了self.message = message来存储异常消息。
【2】异常链
如果程序中出现了多个异常,我们可以使用异常链来追踪异常的传递路径。异常链通常表示在处理异常时所发生的子异常链。常见的情况是需要在捕获异常时记录被捕获的异常,并将它们传递给上层调用者,以便调用者确定如何处理异常情况。使用以下语句可以实现异常链:
try:
#可能会产生异常的代码段
except ExceptionType1 as e1:
#处理异常情况
raise MyException("A fatal error occurred!").with_traceback(sys.exc_info()[2]).with_traceback(e1.__traceback__)
其中exception_name是异常类型名,message是异常描述。
【3】异常清理
异常发生时,需要对异常资源进行清理。在Python中,with语句就是一种常见的资源管理机制。当with语句结束时,它会自动关闭一些资源。例如,我们可以使用with语句来打开和关闭文件。当Python代码执行到with语句时,就会自动将文件对象赋值给变量f,执行代码块,然后自动关闭文件对象。使用以下语句可以实现异常清理:
with open("file.txt",'w') as f:
f.write("hello world")
以上代码,我们打开了一个文件对象f,并向其中写入"hello world"。with语句会在代码块结束时自动关闭文件对象,无论是否引发异常。这样做可以避免打开文件后忘记关闭,从而浪费计算机资源。
总之,Python 的异常处理机制是编写高质量代码不可或缺的重要部分,程序员可以根据实际需要定义可以处理多种异常的语句块,从而让程序具备健壮性和可读性,变得更加优秀。
