介绍
在这个实验中,你将学习如何检查 Python 中是否抛出了特定的异常。本实验重点在于理解不同的异常类型以及如何有效地处理它们。
你将通过 Python 脚本中的实际示例,探索常见的异常类型,如 TypeError、NameError、IndexError、KeyError、ValueError 和 FileNotFoundError。本实验将指导你创建一个 exceptions_demo.py 文件,并添加代码,展示如何使用 try...except 块抛出和捕获每种异常类型。
了解异常类型
在这一步中,你将了解 Python 中不同类型的异常。异常是会打乱程序正常执行流程的事件。理解异常类型对于有效处理错误至关重要。
Python 有许多内置异常,你也可以创建自己的异常。以下是一些常见的异常类型:
TypeError:当操作或函数应用于类型不恰当的对象时抛出。NameError:当在局部或全局命名空间中找不到某个名称时抛出。IndexError:当序列下标超出范围时抛出。KeyError:当在字典中找不到某个键时抛出。ValueError:当操作或函数接收到类型正确但值不恰当的参数时抛出。FileNotFoundError:当请求的文件或目录不存在时抛出。
让我们通过一些示例来探索这些异常类型。我们将使用 VS Code 编辑器在 ~/project 目录下创建一个名为 exceptions_demo.py 的 Python 脚本。
- 打开 VS Code。
- 在
~/project目录下创建一个名为exceptions_demo.py的新文件。 - 将以下代码添加到
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 块将被执行。
现在,让我们运行这个脚本:
- 在 VS Code 中打开终端。
- 导航到
~/project目录:
cd ~/project
- 使用
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。
- 使用 VS Code 打开
~/project目录下的exceptions_demo.py文件。 - 修改脚本,使其仅在将字符串转换为整数时捕获
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...") 语句将始终执行,这表明程序在处理异常后会继续运行。
现在,让我们运行这个脚本:
- 在 VS Code 中打开终端。
- 导航到
~/project目录:
cd ~/project
- 使用
python命令运行exceptions_demo.py脚本:
python exceptions_demo.py
你应该会看到以下输出:
ValueError caught: invalid literal for int() with base 10: 'abc'
Continuing execution...
这个输出表明 ValueError 被捕获,并且程序继续执行。
现在,让我们修改脚本以抛出不同的异常,例如 TypeError,并看看它是如何被处理的:
- 使用 VS Code 打开
~/project目录下的exceptions_demo.py文件。 - 修改脚本以抛出
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...
这个输出表明 TypeError 被 except Exception as e: 块捕获,因为没有专门的 except TypeError 块。
捕获特定的异常能让你以不同的方式处理不同的错误,使你的代码更健壮,更易于调试。在下一步中,你将学习如何验证异常实例。
验证异常实例
在这一步中,你将学习如何验证异常实例,以获取有关所发生错误的更多信息。当你捕获到一个异常时,你可以访问异常对象本身,它包含了错误的详细信息。
让我们修改 exceptions_demo.py 脚本,以打印异常实例的类型和参数。
- 使用 VS Code 打开
~/project目录下的exceptions_demo.py文件。 - 修改脚本,以打印
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 属性是一个元组,包含传递给异常构造函数的参数。
现在,让我们运行这个脚本:
- 在 VS Code 中打开终端。
- 导航到
~/project目录:
cd ~/project
- 使用
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 中不同的异常类型,这对于有效的错误处理至关重要。本实验介绍了常见的内置异常,如 TypeError、NameError、IndexError、KeyError、ValueError 和 FileNotFoundError。
接着,实验提供了如何使用 try...except 块引发和捕获这些异常的实际示例。创建了一个名为 exceptions_demo.py 的 Python 脚本,用于演示每种异常类型,展示了如何预测和处理可能会干扰程序正常执行流程的潜在错误。



