Python中异常捕获与处理的方法总结
1. 何时需要异常捕获
当程序出现一些非预期行为时,Python会抛出异常,并中断程序的执行。这时,需要我们进行异常捕获,对异常进行处理,以避免程序直接崩溃。
2. 异常捕获的语法
try:
# 可能会抛出异常的代码块
except Exception1:
# 异常类型1的处理方式
except Exception2:
# 异常类型2的处理方式
...
else:
# 没有异常时的处理方式
finally:
# 无论是否有异常,都必须执行的代码块
try
代码块中尝试执行可能会抛出异常的代码。- 如果
try
中的语句执行正常,则会跳过所有的except
语句和else
语句。 - 如果
try
中的语句执行出现异常,则会从上到下依次检查except
语句,看哪个异常类型匹配。 - 如果某个
except
语句匹配,则执行该语句,并跳出try
代码块。 - 如果没有找到匹配的
except
语句,则异常会交给外层语句处理,如果没有处理,则会导致程序崩溃。 else
语句和finally
语句块可以根据需要省略,else
语句在没有抛出异常时执行,finally
语句块无论是否发生异常都一定会执行。
3. 示例1:除数为0异常的处理
例如,现有一个除法的示例程序,需要输入两个数字,计算第一个数字除以第二个数字的结果。
def divide(a, b):
result = a / b
print(f"{a}/{b}={result}")
divide(6, 3)
divide(6, 0)
divide(6, 2)
运行后输出:
6/3=2.0
Traceback (most recent call last):
File "/path/to/file.py", line 7, in <module>
divide(6, 0)
File "/path/to/file.py", line 3, in divide
result = a / b
ZeroDivisionError: division by zero
6/2=3.0
当计算6/0时,会抛出ZeroDivisionError
异常,程序会直接崩溃。因此需要使用异常捕获机制进行处理。
def divide(a, b):
try:
result = a / b
print(f"{a}/{b}={result}")
except ZeroDivisionError:
print("除数不能为0")
divide(6, 3)
divide(6, 0)
divide(6, 2)
运行后输出:
6/3=2.0
除数不能为0
6/2=3.0
现在,当计算6/0时,会执行except
语句块,并输出提示信息,而程序不会崩溃,可以继续执行下去。
4. 示例2:文件操作异常的处理
另外一个常见的场景是文件操作,如果打开文件失败或读取文件时发生异常,需要对异常进行处理。
def read_file(file_path):
with open(file_path, 'r') as f:
content = f.read()
print(content)
read_file('not_exist.txt')
read_file('test.txt')
运行后输出:
Traceback (most recent call last):
File "/path/to/file.py", line 8, in <module>
read_file('not_exist.txt')
File "/path/to/file.py", line 2, in read_file
with open(file_path, 'r') as f:
FileNotFoundError: [Errno 2] No such file or directory: 'not_exist.txt'
test file
当读取不存在的文件时,会抛出FileNotFoundError
异常,导致程序崩溃。因此需要对异常进行捕获和处理。
def read_file(file_path):
try:
with open(file_path, 'r') as f:
content = f.read()
print(content)
except FileNotFoundError:
print("文件不存在")
read_file('not_exist.txt')
read_file('test.txt')
运行后输出:
文件不存在
test file
现在当尝试读取不存在的文件时,会输出except
语句块中的信息,程序不会崩溃。