Python 异常处理
- Python 异常处理:异常处理是为了捕获和处理程序中的异常情况,Python 使用
try...except
代码块来实现异常处理。 - 捕获特定异常:Python 允许为不同类型的异常编写不同的
except
代码块,以便针对不同异常采取特定的处理措施。 - 使用
try...else
和try...finally
:Python 中的try...else
用于在没有异常时执行特定代码块,而try...finally
中的代码块始终会被执行,无论是否发生异常。
在上一教程中,我们学习了Python 异常。我们知道异常会异常终止程序的执行。
这就是为什么处理异常很重要。在 Python 中,我们使用 try...except
代码块。
Python 的 try...except 代码块
try...except
代码块用于处理 Python 中的异常。下面是 try...except
代码块的语法:
try:
# 可能导致异常的代码
except:
# 发生异常时执行的代码
这里,我们把可能产生异常的代码放在 try
代码块中。每个 try
代码块后面都跟着一个 except
代码块。
当发生异常时,它被 except
代码块捕获。except
代码块不能单独使用,必须与 try 代码块一起使用。
示例:使用 try...except 进行异常处理
try:
numerator = 10
denominator = 0
result = numerator/denominator
print(result)
except:
print("错误:分母不能为 0。")
# 输出:错误:分母不能为 0。
在这个示例中,我们试图将一个数除以 0。这里,这段代码产生了一个异常。
为了处理这个异常,我们将代码 result = numerator/denominator
放在了 try
代码块中。现在当异常发生时,try
代码块内的其余代码将被跳过。
except
代码块捕获了异常,except
代码块内的语句被执行。
如果 try
代码块中的语句没有产生异常,except
代码块将被跳过。
在 Python 中捕获特定异常
对于每个 try
代码块,可以有零个或多个 except
代码块。多个 except
代码块允许我们以不同的方式处理每个异常。
每个 except
代码块的参数类型表明它可以处理的异常类型。例如,
try:
even_numbers = [2,4,6,8]
print(even_numbers[5])
except ZeroDivisionError:
print("分母不能为 0。")
except IndexError:
print("索引超出范围。")
# 输出:索引超出范围
在这个例子中,我们创建了一个名为 even_numbers 的列表。
由于列表索引从 0 开始,列表的最后一个元素位于索引 3。注意这个语句,
print(even_numbers[5])
这里,我们试图访问索引 5 的值。因此,发生了 IndexError
异常。
当 try
代码块中发生 IndexError
异常时,
ZeroDivisionError
异常被跳过。IndexError
异常内的代码集被执行。
Python 的 try 与 else 子句
在某些情况下,如果 try
代码块内的代码块没有发生任何错误,我们可能希望执行某个代码块。
对于这些情况,您可以在 try
语句中使用可选的 else
关键字。
让我们来看一个例子:
# 程序以打印偶数的倒数
try:
num = int(input("输入一个数字:"))
assert num % 2 == 0
except:
print("不是一个偶数!")
else:
reciprocal = 1/num
print(reciprocal)
输出
如果我们传入奇数:
输入一个数字:1
不是一个偶数!
如果我们传入偶数,将计算并显示倒数。
输入一个数字:4
0.25
但是,如果我们传入 0,我们会得到 ZeroDivisionError
,因为 else
代码
块内的代码不会被前面的 except
处理。
输入一个数字:0
追踪 (最近的调用最后一次):
文件 "<string>",行 7,于 <module>
reciprocal = 1/num
ZeroDivisionError: 除以零
注意:else
子句中的异常不会被前面的 except 子句处理。
Python 的 try...finally
在 Python 中,无论是否有异常,finally
代码块总是会被执行。
finally
代码块是可选的。对于每个 try
代码块,只能有一个 finally
代码块。
让我们看一个例子,
try:
numerator = 10
denominator = 0
result = numerator/denominator
print(result)
except:
print("错误:分母不能为 0。")
finally:
print("这是 finally 代码块。")
输出
错误:分母不能为 0。
这是 finally 代码块。
在上面的示例中,我们在 try
代码块中尝试将一个数除以 0。这里,这段代码产生了一个异常。
异常被 except
代码块捕获。然后执行 finally
代码块。