如何检查 Python 中是否引发了特定异常

PythonPythonBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个实验中,你将学习如何检查 Python 中是否抛出了特定的异常。本实验重点在于理解不同的异常类型以及如何有效地处理它们。

你将通过 Python 脚本中的实际示例,探索常见的异常类型,如 TypeErrorNameErrorIndexErrorKeyErrorValueErrorFileNotFoundError。本实验将指导你创建一个 exceptions_demo.py 文件,并添加代码,展示如何使用 try...except 块抛出和捕获每种异常类型。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/ErrorandExceptionHandlingGroup(["Error and Exception Handling"]) python/ErrorandExceptionHandlingGroup -.-> python/catching_exceptions("Catching Exceptions") python/ErrorandExceptionHandlingGroup -.-> python/raising_exceptions("Raising Exceptions") python/ErrorandExceptionHandlingGroup -.-> python/custom_exceptions("Custom Exceptions") subgraph Lab Skills python/catching_exceptions -.-> lab-559566{{"如何检查 Python 中是否引发了特定异常"}} python/raising_exceptions -.-> lab-559566{{"如何检查 Python 中是否引发了特定异常"}} python/custom_exceptions -.-> lab-559566{{"如何检查 Python 中是否引发了特定异常"}} end

了解异常类型

在这一步中,你将了解 Python 中不同类型的异常。异常是会打乱程序正常执行流程的事件。理解异常类型对于有效处理错误至关重要。

Python 有许多内置异常,你也可以创建自己的异常。以下是一些常见的异常类型:

  • TypeError:当操作或函数应用于类型不恰当的对象时抛出。
  • NameError:当在局部或全局命名空间中找不到某个名称时抛出。
  • IndexError:当序列下标超出范围时抛出。
  • KeyError:当在字典中找不到某个键时抛出。
  • ValueError:当操作或函数接收到类型正确但值不恰当的参数时抛出。
  • FileNotFoundError:当请求的文件或目录不存在时抛出。

让我们通过一些示例来探索这些异常类型。我们将使用 VS Code 编辑器在 ~/project 目录下创建一个名为 exceptions_demo.py 的 Python 脚本。

  1. 打开 VS Code。
  2. ~/project 目录下创建一个名为 exceptions_demo.py 的新文件。
  3. 将以下代码添加到 exceptions_demo.py 文件中:
## TypeError
try:
    result = 1 + "a"
except TypeError as e:
    print(f"TypeError: {e}")

## NameError
try:
    print(undefined_variable)
except NameError as e:
    print(f"NameError: {e}")

## IndexError
try:
    my_list = [1, 2, 3]
    print(my_list[5])
except IndexError as e:
    print(f"IndexError: {e}")

## KeyError
try:
    my_dict = {"a": 1, "b": 2}
    print(my_dict["c"])
except KeyError as e:
    print(f"KeyError: {e}")

## ValueError
try:
    num = int("abc")
except ValueError as e:
    print(f"ValueError: {e}")

## FileNotFoundError
try:
    with open("nonexistent_file.txt", "r") as f:
        content = f.read()
except FileNotFoundError as e:
    print(f"FileNotFoundError: {e}")

这个脚本展示了如何使用 try...except 块抛出和捕获不同类型的异常。每个 try 块都包含可能抛出特定异常的代码。如果异常发生,相应的 except 块将被执行。

现在,让我们运行这个脚本:

  1. 在 VS Code 中打开终端。
  2. 导航到 ~/project 目录:
cd ~/project
  1. 使用 python 命令运行 exceptions_demo.py 脚本:
python exceptions_demo.py

你应该会看到以下输出:

TypeError: unsupported operand type(s) for +: 'int' and 'str'
NameError: name 'undefined_variable' is not defined
IndexError: list index out of range
KeyError: 'c'
ValueError: invalid literal for int() with base 10: 'abc'
FileNotFoundError: [Errno 2] No such file or directory: 'nonexistent_file.txt'

这个输出表明每个 try 块都抛出了预期的异常,并且相应的 except 块捕获并打印了异常信息。

理解不同的异常类型以及如何处理它们对于编写健壮、可靠的 Python 代码至关重要。在下一步中,你将学习如何捕获特定的异常并进行适当的处理。

捕获特定异常

在上一步中,你了解了 Python 中不同类型的异常。现在,你将学习如何使用 try...except 块捕获特定的异常。这能让你以不同的方式处理不同的错误,使你的代码更健壮。

捕获异常时,最佳实践是尽可能具体。这样可以防止你的 except 块意外捕获到它并非设计用来处理的异常,因为这可能会掩盖错误,增加调试难度。

让我们修改 exceptions_demo.py 脚本,以便在尝试将字符串转换为整数时捕获特定的异常,例如 ValueError

  1. 使用 VS Code 打开 ~/project 目录下的 exceptions_demo.py 文件。
  2. 修改脚本,使其仅在将字符串转换为整数时捕获 ValueError
try:
    num = int("abc")
except ValueError as e:
    print(f"ValueError caught: {e}")
except Exception as e:
    print(f"Some other exception: {e}")

print("Continuing execution...")

在这个示例中,我们专门捕获了 int("abc") 失败时发生的 ValueError。如果 try 块中发生了任何其他异常,它将被 except Exception as e: 块捕获。如果捕获到任何异常,print("Continuing execution...") 语句将始终执行,这表明程序在处理异常后会继续运行。

现在,让我们运行这个脚本:

  1. 在 VS Code 中打开终端。
  2. 导航到 ~/project 目录:
cd ~/project
  1. 使用 python 命令运行 exceptions_demo.py 脚本:
python exceptions_demo.py

你应该会看到以下输出:

ValueError caught: invalid literal for int() with base 10: 'abc'
Continuing execution...

这个输出表明 ValueError 被捕获,并且程序继续执行。

现在,让我们修改脚本以抛出不同的异常,例如 TypeError,并看看它是如何被处理的:

  1. 使用 VS Code 打开 ~/project 目录下的 exceptions_demo.py 文件。
  2. 修改脚本以抛出 TypeError
try:
    result = 1 + "a"
except ValueError as e:
    print(f"ValueError caught: {e}")
except Exception as e:
    print(f"Some other exception: {e}")

print("Continuing execution...")

现在,再次运行脚本:

python exceptions_demo.py

你应该会看到以下输出:

Some other exception: unsupported operand type(s) for +: 'int' and 'str'
Continuing execution...

这个输出表明 TypeErrorexcept Exception as e: 块捕获,因为没有专门的 except TypeError 块。

捕获特定的异常能让你以不同的方式处理不同的错误,使你的代码更健壮,更易于调试。在下一步中,你将学习如何验证异常实例。

验证异常实例

在这一步中,你将学习如何验证异常实例,以获取有关所发生错误的更多信息。当你捕获到一个异常时,你可以访问异常对象本身,它包含了错误的详细信息。

让我们修改 exceptions_demo.py 脚本,以打印异常实例的类型和参数。

  1. 使用 VS Code 打开 ~/project 目录下的 exceptions_demo.py 文件。
  2. 修改脚本,以打印 ValueError 异常的类型和参数:
try:
    num = int("abc")
except ValueError as e:
    print(f"Exception type: {type(e)}")
    print(f"Exception arguments: {e.args}")
    print(f"ValueError caught: {e}")
except Exception as e:
    print(f"Some other exception: {e}")

print("Continuing execution...")

在这个示例中,我们使用 type(e) 打印异常对象的类型,并使用 e.args 打印异常的参数。e.args 属性是一个元组,包含传递给异常构造函数的参数。

现在,让我们运行这个脚本:

  1. 在 VS Code 中打开终端。
  2. 导航到 ~/project 目录:
cd ~/project
  1. 使用 python 命令运行 exceptions_demo.py 脚本:
python exceptions_demo.py

你应该会看到以下输出:

Exception type: <class 'ValueError'>
Exception arguments: ("invalid literal for int() with base 10: 'abc'",)
ValueError caught: invalid literal for int() with base 10: 'abc'
Continuing execution...

这个输出显示了异常的类型(ValueError)以及传递给异常构造函数的参数(一个包含错误消息的元组)。

你可以使用这些信息来提供更详细的错误消息,或者根据异常的类型和参数采取特定的操作。

例如,你可以检查异常参数是否包含特定的错误消息:

try:
    num = int("abc")
except ValueError as e:
    if "invalid literal" in e.args[0]:
        print("Invalid input: Please enter a valid number.")
    else:
        print(f"ValueError caught: {e}")
except Exception as e:
    print(f"Some other exception: {e}")

print("Continuing execution...")

在这个示例中,我们检查 ValueError 异常的第一个参数是否包含字符串 "invalid literal"。如果包含,我们会打印一条更具体的错误消息。

验证异常实例能让你更智能地处理错误,并向用户提供更具信息性的错误消息。

总结

在本次实验中,第一步着重于理解 Python 中不同的异常类型,这对于有效的错误处理至关重要。本实验介绍了常见的内置异常,如 TypeErrorNameErrorIndexErrorKeyErrorValueErrorFileNotFoundError

接着,实验提供了如何使用 try...except 块引发和捕获这些异常的实际示例。创建了一个名为 exceptions_demo.py 的 Python 脚本,用于演示每种异常类型,展示了如何预测和处理可能会干扰程序正常执行流程的潜在错误。