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)
输出
该条目是一个 哎呀! 发生。 下一个条目。 条目为 0 哎呀! 发生。 下一个条目。 条目是 2 2的倒数是0.5
在这个程序中,我们循环遍历 随机列表列表。如前所述,可能导致异常的部分放置在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语句中使用 optional关键字。
注意: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)
输出
如果我们传递一个奇数:
输入一个数字:1 不是偶数!
如果我们传递偶数,则计算并显示倒数。
输入数字:4 0.25
但是,如果我们传递 0,我们会得到,ZeroDivisionError因为里面的代码块else没有被前面的 处理except。
输入一个数字:0 回溯(最近一次调用最后一次): 文件“”,第 7 行,在 中 倒数 = 1/num ZeroDivisionError: 除以零


Python 尝试…终于

tryPython 中的语句可以有一个可选的finally子句。该子句无论如何都会执行,一般用于释放外部资源。
例如,我们可能通过网络连接到远程数据中心,或者使用文件或图形用户界面 (GUI)。
在所有这些情况下,无论程序是否成功运行,我们都必须在程序停止之前清理资源。这些操作(关闭文件、GUI 或断开网络连接)在finally子句中执行以保证执行。
下面是一个文件操作示例来说明这一点。
try: f = open(“test.txt”,encoding = ‘utf-8’) # perform file operations finally: f.close()
即使在程序执行期间发生异常,这种类型的构造也能确保文件被关闭。