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

精通 Python 异常处理:try、except、else 与 finally 详解

精通 Python 异常处理:try、except、else 与 finally 详解

本指南通过实用代码片段和最佳实践技巧,带你了解 Python 的异常处理结构。

视频:Python 异常处理(try..except..finally)

Python 中的异常

运行时错误发生时,Python 会引发内置异常。解释器停止当前代码块,并沿调用栈向上传播异常,直到找到处理器。若无处理器,程序终止并打印回溯。

考虑调用链:A 调用 B,B 调用 C。若 C 引发异常且未在本地处理,异常冒泡至 B 再至 A。未处理异常导致程序突然崩溃。

在 Python 中捕获异常

拦截异常,将可能不安全的代码放入 try 块。except 子句包含异常发生时执行的逻辑。

下面简洁示例演示流程:

# 导入 sys 模块以检查异常类型
import sys
random_list = ['a', 0, 2]
for entry in random_list:
    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'> occurred. Next entry. The entry is 2 The reciprocal of 2 is 0.5

代码遍历 random_list。若转 int 或除法失败,except 块处理错误、记录日志并继续下一项。成功转换时跳出循环并打印倒数。

因所有内置异常继承自 Exception,可通用捕获:

# 导入 sys 模块以检查异常类型
import sys
random_list = ['a', 0, 2]
for entry in random_list:
    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)

输出相同,但处理器通过 e.__class__ 引用具体异常类。

在 Python 中捕获特定异常

宽泛捕获所有异常可能掩盖 bug 并增加调试难度。应仅列出预期的异常类型。

try 块可包含多个 except 子句;仅首个匹配子句执行。示例:

try:
    # 可能引发错误的代码
    pass
except ValueError:
    # 处理 ValueError
    pass
except (TypeError, ZeroDivisionError):
    # 处理 TypeError 或 ZeroDivisionError
    pass
except Exception:
    # 兜底处理其他异常
    pass

在 Python 中引发异常

除自动异常外,开发者可用 raise 语句显式引发错误。可选传递消息说明原因。

raise KeyboardInterrupt  # Traceback: KeyboardInterrupt
raise MemoryError("This is an argument")  # Traceback: 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)

Python try 与 else 子句

可选 else 子句仅在 try 块无异常完成时运行。此模式将成功路径代码与错误处理分离。

示例:打印偶数的倒数。

# 程序打印偶数的倒数
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

注意若 num 为零,ZeroDivisionError 在 else 块中引发,不会被前面的 except 捕获。

Python try…finally

finally 子句保证清理代码无论是否发生异常都运行。处理文件、网络连接或 GUI 等外部资源时必不可少。

文件处理典型用法:

try:
    f = open("test.txt", encoding='utf-8')
    # 执行文件操作
finally:
    f.close()

文件总会被关闭,即使处理过程中出错。

Python

  1. 树莓派与 Python 构建远程温度传感器:分步实战指南
  2. C++ 异常处理实战:try、catch、throw 完整指南与示例
  3. Python关键字与标识符:掌握保留字与命名规范
  4. Python语句、缩进与注释:清晰指南
  5. Python变量、常量与字面量完全指南
  6. 精通Python类型转换与强制转换:综合指南
  7. 精通Python输入输出与模块导入:实战指南
  8. 精通Python Pass语句:实战指南
  9. 理解Python全局、局部与非局部变量
  10. 精通 Python 目录与文件操作
  11. 精通 Python 异常处理:try、except、else 与 finally 详解
  12. 精通 Python 异常处理:try、except、finally 与 raise 高效用法