内置异常是 Python 中预定义的错误类,用于处理程序中的错误和异常条件。它们是从基类 BaseException
派生而来并且是标准库的一部分。
Python 中的标准内置异常
以下是一些 Python 中可用的标准异常列表:
序号 |
异常名称 & 描述 |
1 |
Exception |
2 |
StopIteration |
3 |
SystemExit |
4 |
StandardError |
5 |
ArithmeticError |
6 |
OverflowError |
7 |
FloatingPointError |
8 |
ZeroDivisionError |
9 |
AssertionError |
10 |
AttributeError |
11 |
EOFError |
12 |
ImportError |
13 |
KeyboardInterrupt |
14 |
LookupError |
15 |
IndexError |
16 |
KeyError |
17 |
NameError |
18 |
UnboundLocalError |
19 |
EnvironmentError |
20 |
IOError |
21 |
OSError |
22 |
SyntaxError |
23 |
IndentationError |
24 |
SystemError |
25 |
SystemExit |
26 |
TypeError |
27 |
ValueError |
28 |
RuntimeError |
29 |
NotImplementedError |
一些标准异常的例子
IndexError
当试图访问无效索引项时会出现这种情况:
numbers = [10, 20, 30, 40]
for n in range(5):
print(numbers[n])
它将产生以下输出:
10
20
30
40
Traceback (most recent call last):
print(numbers[n])
IndexError: list index out of range
ModuleNotFoundError
当模块找不到时会出现这种情况:
import notamodule
Traceback (most recent call last): import notamodule ModuleNotFoundError: No module named 'notamodule'
KeyError
当字典键未找到时会发生这种情况:
D1 = {'1': "aa", '2': "bb", '3': "cc"}
print(D1['4'])
Traceback (most recent call last): D1['4'] KeyError: '4'
ImportError
当指定的函数不可导入时会显示这种情况:
from math import cube
Traceback (most recent call last): from math import cube ImportError: cannot import name 'cube'
StopIteration
当迭代器流耗尽后调用 next() 函数时会出现这种错误:
it = iter([1, 2, 3])
next(it)
next(it)
next(it)
next(it)
Traceback (most recent call last): next(it) StopIteration
TypeError
当不适当类型的对象应用了运算符或函数时会显示这种情况:
print('2' + 2)
Traceback (most recent call last): '2' + 2 TypeError: must be str, not int
ValueError
当函数的参数类型不适当时会显示这种情况:
print(int('xyz'))
Traceback (most recent call last): int('xyz') ValueError: invalid literal for int() with base 10: 'xyz'
NameError
当对象未找到时会遇到这种情况:
print(age)
Traceback (most recent call last): age NameError: name 'age' is not defined
ZeroDivisionError
当除法运算中的第二个操作数为零时会出现这种情况:
x = 100 / 0
Traceback (most recent call last): x = 100 / 0 ZeroDivisionError: division by zero
KeyboardInterrupt
当用户在程序执行过程中按下中断键通常为 Ctrl+C 时:
name = input('enter your name')
enter your name^c
Traceback (most recent call last): name = input('enter your name') KeyboardInterrupt
内置异常的层次结构
Python 中的异常按照层次结构进行组织,顶部为 BaseException
。以下是一个简化的层次结构:
如何使用内置异常
正如我们已经知道的那样,Python 中的内置异常是预定义的类,用于处理特定的错误条件。现在,这里有一个详细的指南,说明如何在你的 Python 程序中有效地使用它们:
使用 try-except 块处理异常
处理 Python 中异常的主要方式是使用 "try-except" 块。这允许你在代码执行过程中捕捉并响应异常。
示例
在下面的示例中,可能引发异常的代码被放在 "try" 块内。"except" 块捕捉指定的 "ZeroDivisionError" 并处理它:
try:
result = 1 / 0
except ZeroDivisionError as e:
print(f"Caught an exception: {e}")
得到的输出如下:
Caught an exception: division by zero
处理多个异常
你可以通过在 "except" 块内指定它们来处理多个异常,如下例所示:
try:
result = int('abc')
except (ValueError, TypeError) as e:
print(f"Caught a ValueError or TypeError: {e}")
上面代码的输出如下:
Caught a ValueError or TypeError: invalid literal for int() with base 10: 'abc'
使用 "else" 和 "finally" 块
如果 "try" 子句中的代码块没有引发异常,则执行 "else" 块:
try:
number = int(input("Enter a number: "))
except ValueError as e:
print(f"Invalid input: {e}")
else:
print(f"You entered: {number}")
上面代码的输出根据输入不同而变化:
Enter a number: bn
Invalid input: invalid literal for int() with base 10: 'bn'
"finally" 块无论是否发生异常都会执行。通常用于清理动作,如关闭文件或释放资源:
try:
file = open('example.txt', 'r')
content = file.read()
except FileNotFoundError as e:
print(f"File not found: {e}")
finally:
file.close()
print("File closed.")
上面代码的输出如下:
File closed.
显式地引发内置异常
在 Python 中,你可以引发内置异常来指示代码中的错误或异常条件。这允许你处理特定的错误情景并向用户提供信息性的错误信息。
语法
以下是引发内置异常的基本语法:
raise ExceptionClassName("Error message")
示例
在这个示例中,"divide" 函数尝试除以两个数字 "a" 和 "b"。如果 "b" 是零,则引发带有自定义消息的 "ZeroDivisionError":
def divide(a, b):
if b == 0:
raise ZeroDivisionError("Cannot divide by zero")
return a / b
try:
result = divide(10, 0)
except ZeroDivisionError as e:
print(f"Error: {e}")
得到的输出如下:
Error: Cannot divide by zero