1. 首页
  2. 技术文章

32、Python异常处理使用try,except和finally语句

在本教程中,您将在示例的帮助下使用try,except和finally语句学习如何在Python程序中处理异常。

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原因ValueError0原因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运行无误,则可能要运行某个代码块。对于这些情况,可以elsetry语句中使用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)

输出

如果我们传递一个奇数:

Enter a number: 1
Not an even number!

如果我们传递一个偶数,则将计算并显示倒数。

Enter a number: 4
0.25

但是,如果我们传递0,则得到的结果ZeroDivisionError是,其中的代码块else不是由previous处理的except

Enter a number: 0
Traceback (most recent call last):
  File "<string>", line 7, in <module>
    reciprocal = 1/num
ZeroDivisionError: division by zero

Python尝试…最终

tryPython中的语句可以有一个可选finally子句。该子句无论如何执行,通常用于释放外部资源。

例如,我们可能通过网络或使用文件或图形用户界面(GUI)连接到远程数据中心。

在所有这些情况下,无论程序是否成功运行,我们都必须在程序停止之前清理资源。这些操作(关闭文件,GUI或与网络断开连接)在该finally子句中执行,以确保执行。

这是一个文件操作的例子来说明这一点。

try:
   f = open("test.txt",encoding = 'utf-8')
   # perform file operations
finally:
   f.close()

这种类型的构造可确保即使在程序执行期间发生异常,也可以关闭文件。

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站不拥有所有权,不承担相关法律责任。如发现有侵权/违规的内容, 联系QQ1841324605,本站将立刻清除。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

联系我们

服务热线:130-0886-1890

QR code