授课语音

Python 中的异常处理机制

异常处理是 Python 中的重要特性,它帮助程序在运行时处理不可预见的错误,确保程序的正常运行。通过异常处理,可以捕获错误并采取相应的措施,而不是让程序直接崩溃。Python 提供了 tryexceptelsefinally 等关键字来管理异常。


1. 异常处理概述

异常是指程序执行过程中发生的错误或意外情况。在 Python 中,当代码运行时出现异常,解释器会停止当前代码的执行,并查找合适的异常处理代码。如果找到了合适的 except 块,程序会执行该块代码,继续运行。如果没有合适的处理方式,程序会终止并显示错误信息。

1.1 异常的基本概念

  • 异常类型:每种异常都有一个对应的类型,如 ZeroDivisionErrorFileNotFoundErrorValueError 等。
  • 异常的传播:异常会从发生的地方开始向外传播,直到找到相应的处理器。如果没有找到处理器,程序将终止。

2. 异常处理语法

Python 的异常处理机制主要通过 tryexceptelsefinally 来实现。

2.1 tryexcept

try 块用于捕获可能发生异常的代码,except 块用于处理异常。最基本的语法格式如下:

try:
    # 可能引发异常的代码
    x = 1 / 0  # 除零错误
except ZeroDivisionError:
    # 捕获到除零异常,执行的代码
    print("不能除以零!")

中文注释

  • try 块中包含可能引发异常的代码。
  • except 块用于捕获特定类型的异常,这里我们捕获的是 ZeroDivisionError 异常,并在出现异常时打印提示信息。

2.2 多个 except

可以针对不同类型的异常,设置多个 except 块来处理不同的错误。

try:
    num = int(input("请输入一个数字: "))
    result = 10 / num
except ZeroDivisionError:
    print("错误:不能除以零!")
except ValueError:
    print("错误:输入无效,必须是数字!")
except Exception as e:
    print(f"发生了未知错误: {e}")

中文注释

  • except ZeroDivisionError 用来处理除零错误。
  • except ValueError 用来处理输入的值无法转换为整数的错误。
  • except Exception as e 用来捕获所有其他异常,并打印出错误信息。

2.3 else

else 块在没有发生异常时执行。如果 try 块中的代码没有抛出异常,则会执行 else 块中的代码。

try:
    num = int(input("请输入一个数字: "))
    result = 10 / num
except ZeroDivisionError:
    print("错误:不能除以零!")
except ValueError:
    print("错误:输入无效,必须是数字!")
else:
    print(f"计算结果是: {result}")

中文注释

  • else 块只有在 try 块没有引发异常时才会执行。此处我们计算 result 并打印结果。

2.4 finally

finally 块中的代码无论是否发生异常都会执行,通常用于清理资源,比如关闭文件、释放网络连接等。

try:
    file = open("test.txt", "r")
    content = file.read()
except FileNotFoundError:
    print("错误:文件未找到!")
finally:
    file.close()  # 无论是否发生异常,都会执行文件关闭操作
    print("文件已关闭。")

中文注释

  • finally 块中的代码不受异常是否发生的影响。在此示例中,文件始终会被关闭。

3. 自定义异常

除了使用 Python 内置的异常类型,还可以自定义异常类型来处理特定的错误。自定义异常类需要继承 Exception 类。

3.1 定义自定义异常

class MyCustomError(Exception):
    """自定义异常类"""
    pass

def test_function():
    raise MyCustomError("这是一个自定义异常")

try:
    test_function()
except MyCustomError as e:
    print(f"捕获到自定义异常: {e}")

中文注释

  • class MyCustomError(Exception) 定义了一个继承自 Exception 的自定义异常类。
  • test_function 中,我们手动抛出 MyCustomError 异常并捕获它。

4. 异常链

Python 支持在捕获异常时重新抛出新的异常,或者将当前异常传递到另一个地方处理,这就是异常链。

4.1 异常链的示例

try:
    x = 1 / 0
except ZeroDivisionError as e:
    raise ValueError("发生了除零错误") from e

中文注释

  • raise ValueError("发生了除零错误") from e 用来抛出一个新的异常,并将原始的异常作为链的部分,帮助调试时追踪异常的根源。

5. 总结

  1. tryexcept:捕获并处理异常,防止程序崩溃。
  2. else:在没有异常时执行,通常用于正常处理结果。
  3. finally:无论是否发生异常,都会执行,用于资源的清理。
  4. 自定义异常:可以根据需求创建自定义异常类型。
  5. 异常链:可以在捕获异常时抛出新的异常,方便错误追踪和处理。

通过使用 Python 的异常处理机制,程序能够在发生错误时更优雅地进行处理,提升了代码的健壮性和可维护性。

去1:1私密咨询

系列课程: