亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> Python

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 导致 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 内的代码块,您可能希望运行某个代码块 运行没有任何错误。对于这些情况,您可以使用可选的 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

  1. Python 关键字和标识符
  2. Python 语句、缩进和注释
  3. Python 变量、常量和文字
  4. Python 类型转换和类型转换
  5. Python 输入、输出和导入
  6. Python pass 语句
  7. Python 全局、局部和非局部变量
  8. Python 目录和文件管理
  9. Python 异常处理使用 try、except 和 finally 语句
  10. Python 和 Raspberry Pi 温度传感器
  11. C++ 异常处理:Try、Catch、throw 示例
  12. Python 异常处理:try、catch、finally 和 raise [示例]