Python程序在运行时检测到异常会直接崩溃,这种系统默认的异常处理方式并不友好。不过Python既可以直接通过try-except语句实现简单的异常捕获与处理的功能,也可以将try-except语句与else或finally子句组合,从而实现更强大的异常捕获与处理的功能。
使用try-except语句捕获异常:
语法格式如下:
try:
可能出错的代码 #需要被监控的代码
except [异常类型[as error]]: #将捕获到的异常对象赋值给error
捕获异常后的处理代码
异常类型名字(内部定义)不同于变量,不需要对他增加字符串表示
以上格式中,try子句之后为可能出错的代码,也就是需要被监控的代码;
except子句中可以指定异常类型,若指定了异常类型,该子句只对与指定异常类型相匹配的异常进行处理,如果没有指定异常类型,则处理try语句捕获的所有异常。except子句中的as关键字用于将捕获到的异常对象赋值给error
except子句后的代码是处理异常时执行的代码
try-except语句的执行过程为:
优先执行try子句中可能出错的代码。如果try子句中没有出现异常,忽略except子句继续向下执行;若try子句中出现异常,忽略try子句的剩余代码。转而执行except语句:若程序出现的异常类型与except子句中指定的异常类型匹配,使用error记录异常异常信息,执行except子句中的代码,否则按系统默认的方式终止程序。
示例一:
try: num_one = int(input("请输入整数:")) num_two = int(input("请输入除数")) print("结果为",num_one/num_two) except : print("出错了")
在该代码中,try字句在第三行才出现错误,所以我们在识别到第三行出现错误后停止执行try语句,转而执行except子句,因为except没有指定异常类型,所以处理try语句捕获的所有异常类型。
运行界面如下:
示例二:
try: num_one = int(input("请输入整数:")) num_two = int(input("请输入除数")) print("结果为",num_one/num_two) except : print("出错了")
运行界面如下:
如果在执行try语句时,煤油出现异常,则忽略except语句,直接输出即可。
示例三:
try: num_one = int(input("请输入整数:")) num_two = int(input("请输入除数")) print("结果为",num_one/num_two) except ZeroDivisionError: print("出错了")
在except子句里面,可以指定异常类型
运行界面:
示例四:
try: num_one = int(input("请输入整数:")) num_two = int(input("请输入除数")) print("结果为",num_one/num_two) except ZeroDivisionError as error: print("出错了,原因:",error)
通过except子句里面的as error:我们可以得知出错的具体原因
运行界面如下:
捕获多个异常需要在except之后以元组(与列表的作用类似,可以保存任意数量、任意类型的元素,但不可以被修改,Python中使用“()”创建元组,元组中的元素以逗号分割)的形式指定多个异常类型
示例代码如下:
try: num_one = int(input("请输入被除数:")) num_two = int(input("请输入除数")) print("结果为",num_one/num_two) except (ZeroDivisionError,ValueError) as error: print("出错了,原因:",error)
运行界面如下:
捕获ZeroDivisionError异常:
捕获ValueError异常:
如果要捕获程序中所有的异常,那么可以将except之后的异常类型设置为Exception或省略不写,如果异常类型省略不写的话,无法获取异常的具体信息。
示例代码如下:
try: num_one = int(input("请输入被除数:")) num_two = int(input("请输入除数")) print("结果为",num_one/num_two) except Exception as error: print("出错了,原因:",error)
运行界面如下:
else子句可以与try-except语句组合成try-except-else结构,若try监控的代码没有异常,程序会直接跳过except语句,执行else子句后的代码。
try-except-else语法格式如下:
try:
可能出错的代码
except [异常类型[as error]]
捕获异常后的处理代码
else:
没有异常的处理代码
示例如下:
try: num_one = int(input("请输入被除数:")) num_two = int(input("请输入除数")) res=num_one/num_two except ZeroDivisionError as error: print("出错了,原因:",error) else: print(res)
运行界面如下所示:
finally子句可以与try-except一起使用,语法格式如下:
try:
可能出错的代码
except [异常类型[as error]] #将捕获到的异常对象赋值给error
捕获异常后的处理代码
finally:
一定执行的代码
无论try子句监控的代码是否产生异常,finally子句都会被执行,基于此特性,在实际应用程序中,finally子句多用于预设资源的清理操作,如关闭文件、关闭网络连接、关闭数据库连接等。
代码示例如下:
try: test= open('./test.py',mode='r',encoding='utf-8') print(test.read()) except FileExistsError as error: print(error) finally: test.close() print('文件已关闭')
运行界面:
在执行过程中,finally与前面的语句执行没有关系,是一定会执行的语句,不受前面语句的执行效果。
同时,也可将这些语句放到一起,语法格式如下:
try:
<语句块1>
except<异常类型>:
<语句块2>
else:对应语句块3在不发生异常时执行
<语句块3>
finally:对应语句块4一定执行(无论是否发生异常)
<语句块4>