Python 异常处理使用 try、except 和 finally 语句
使用 try、except 和 finally 语句处理 Python 异常
在本教程中,您将通过示例学习如何在 Python 程序中使用 try、except 和 finally 语句处理异常。
视频:Python 异常处理(try..except..finally)
Python 中的异常
Python 有许多内置异常,当您的程序遇到错误(程序中的某些地方出错)时会引发这些异常。
当这些异常发生时,Python 解释器会停止当前进程并将其传递给调用进程,直到它被处理。如果不处理,程序会崩溃。
例如,让我们考虑一个程序,其中我们有一个函数 A
调用函数 B
, 它又调用函数 C
.如果函数C
发生异常 但未在 C
中处理 , 异常传递到 B
然后到 A
.
如果从未处理,则会显示一条错误消息,并且我们的程序会突然意外停止。
在 Python 中捕获异常
在 Python 中,可以使用 try
处理异常 声明。
可以引发异常的关键操作放在 try
中 条款。处理异常的代码写在except
子句。
因此,一旦我们捕获到异常,我们就可以选择要执行的操作。这是一个简单的例子。
# import module sys to get the type of exception
import sys
randomList = ['a', 0, 2]
for entry in randomList:
try:
print("The entry is", entry)
r = 1/int(entry)
break
except:
print("Oops!", sys.exc_info()[0], "occurred.")
print("Next entry.")
print()
print("The reciprocal of", entry, "is", r)
输出
The entry is a Oops! <class 'ValueError'> occurred. Next entry. The entry is 0 Oops! <class 'ZeroDivisionError'> occured. Next entry. The entry is 2 The reciprocal of 2 is 0.5
在这个程序中,我们遍历 randomList 的值 列表。如前所述,可能导致异常的部分放在 try
内 块。
如果没有异常发生,except
跳过块并继续正常流程(对于最后一个值)。但是如果发生任何异常,它会被 except
捕获 块(第一个和第二个值)。
在这里,我们使用 exc_info()
打印异常的名称 sys
内的函数 模块。我们可以看到 a
导致 ValueError
和 0
导致 ZeroDivisionError
.
由于 Python 中的每个异常都继承自基础 Exception
类,我们还可以通过以下方式执行上述任务:
# import module sys to get the type of exception
import sys
randomList = ['a', 0, 2]
for entry in randomList:
try:
print("The entry is", entry)
r = 1/int(entry)
break
except Exception as e:
print("Oops!", e.__class__, "occurred.")
print("Next entry.")
print()
print("The reciprocal of", entry, "is", r)
该程序的输出与上述程序相同。
在 Python 中捕获特定异常
在上面的例子中,我们没有在 except
中提到任何具体的异常 子句。
这不是一个好的编程实践,因为它会捕获所有异常并以相同的方式处理每种情况。我们可以指定 except
哪些异常 子句应该抓住。
一个 try
子句可以有任意数量的except
处理不同异常的子句,但是,如果发生异常,只会执行一个。
我们可以使用值元组在 except 子句中指定多个异常。这是一个示例伪代码。
try:
# do something
pass
except ValueError:
# handle ValueError exception
pass
except (TypeError, ZeroDivisionError):
# handle multiple exceptions
# TypeError and ZeroDivisionError
pass
except:
# handle all other exceptions
pass
在 Python 中引发异常
在 Python 编程中,在运行时发生错误时会引发异常。我们还可以使用 raise
手动引发异常 关键字。
我们可以选择将值传递给异常以阐明引发该异常的原因。
>>> raise KeyboardInterrupt
Traceback (most recent call last):
...
KeyboardInterrupt
>>> raise MemoryError("This is an argument")
Traceback (most recent call last):
...
MemoryError: This is an argument
>>> try:
... a = int(input("Enter a positive integer: "))
... if a <= 0:
... raise ValueError("That is not a positive number!")
... except ValueError as ve:
... print(ve)
...
Enter a positive integer: -2
That is not a positive number!
Python 尝试使用 else 子句
在某些情况下,如果 try
内的代码块,您可能希望运行某个代码块 运行没有任何错误。对于这些情况,您可以使用可选的 else
try
关键字 声明。
注意 :else 子句中的异常不被前面的 except 子句处理。
我们来看一个例子:
# program to print the reciprocal of even numbers
try:
num = int(input("Enter a number: "))
assert num % 2 == 0
except:
print("Not an even number!")
else:
reciprocal = 1/num
print(reciprocal)
输出
如果我们传递一个奇数:
Enter a number: 1 Not an even number!
如果我们传递一个偶数,则计算并显示倒数。
Enter a number: 4 0.25
但是,如果我们传递 0,我们会得到 ZeroDivisionError
作为 else
内的代码块 不被前面的 except
处理 .
Enter a number: 0 Traceback (most recent call last): File "<string>", line 7, in <module> reciprocal = 1/num ZeroDivisionError: division by zero
Python 尝试...终于
try
Python 中的语句可以有一个可选的 finally
条款。该子句无论如何执行,一般用于释放外部资源。
例如,我们可能通过网络连接到远程数据中心,或者使用文件或图形用户界面 (GUI)。
在所有这些情况下,无论程序是否成功运行,我们都必须在程序停止之前清理资源。这些操作(关闭文件、GUI 或断开网络连接)在 finally
中执行 保证执行的条款。
下面是一个文件操作的例子来说明这一点。
try:
f = open("test.txt",encoding = 'utf-8')
# perform file operations
finally:
f.close()
这种类型的构造确保即使在程序执行过程中发生异常,文件也会被关闭。
Python