Python 内置错误和异常

官方:
https://docs.python.org/3/library/exceptions.html
https://docs.python.org/3/tutorial/errors.html

在本教程中,您将了解 Python 内置的不同类型的错误和异常。
每当 Python 解释器遇到错误时,就会引发它们。

我们在编写程序时可能会犯某些错误,当我们尝试运行它时会导致错误。python 程序一旦遇到未处理的错误就会终止。这些错误可以大致分为两类:

  1. 语法错误
  2. 逻辑错误(异常)

Python 语法错误

由于不遵循语言的正确结构(语法)而导致的错误称为语法错误解析错误

让我们看一个例子:

>>> if a < 3
  File "<interactive input>", line 1
    if a < 3
           ^
SyntaxError: invalid syntax

如示例中所示,箭头指示解析器遇到语法错误的位置。

我们可以注意到这里的if语句中缺少一个冒号:


Python 逻辑错误(异常)

运行时(通过语法测试后)发生的错误称为异常逻辑错误

例如,当我们尝试打开一个不存在的文件(用于读取)(FileNotFoundError),尝试将一个数字除以零(ZeroDivisionError),或者尝试导入一个不存在的模块()时,它们就会发生ImportError

每当发生这些类型的运行时错误时,Python 都会创建一个异常对象。如果处理不当,它会打印该错误的回溯以及有关该错误发生原因的一些详细信息。

让我们看看 Python 是如何处理这些错误的:

>>> 1 / 0
Traceback (most recent call last):
 File "<string>", line 301, in runcode
 File "<interactive input>", line 1, in <module>
ZeroDivisionError: division by zero

>>> open("imaginary.txt")
Traceback (most recent call last):
 File "<string>", line 301, in runcode
 File "<interactive input>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: 'imaginary.txt'

Python 内置异常

非法操作会引发异常。Python 中有很多内置异常会在发生相应错误时引发。我们可以使用内置local()函数查看所有内置异常,如下所示:

print(dir(locals()['__builtins__']))

locals()['__builtins__']将返回一个内置异常、函数和属性的模块。dir允许我们将这些属性列为字符串。

下面列出了 Python 编程中一些常见的内置异常以及导致它们的错误:

例外错误原因
AssertionErrorassert语句失败时引发。
AttributeError当属性分配或引用失败时引发。
EOFErrorinput()函数达到文件结束条件时引发。
FloatingPointError当浮点操作失败时引发。
GeneratorExit在调用生成器的close()方法时引发。
ImportError未找到导入的模块时引发。
IndexError当序列的索引超出范围时引发。
KeyError在字典中找不到键时引发。
KeyboardInterrupt当用户按下中断键(Ctrl+CDelete)时引发。
MemoryError当操作内存不足时引发。
NameError当在本地或全局范围内找不到变量时引发。
NotImplementedError由抽象方法引发。
OSError当系统操作导致系统相关错误时引发。
OverflowError当算术运算的结果太大而无法表示时引发。
ReferenceError当弱引用代理用于访问垃圾收集的引用时引发。
RuntimeError当错误不属于任何其他类别时引发。
StopIterationnext()函数引发以指示迭代器不再返回项目。
SyntaxError遇到语法错误时由解析器引发。
IndentationError缩进不正确时引发。
TabError当缩进包含不一致的制表符和空格时引发。
SystemError当解释器检测到内部错误时引发。
SystemExitsys.exit()功能提出。
TypeError当函数或操作应用于不正确类型的对象时引发。
UnboundLocalError当对函数或方法中的局部变量进行引用但没有值绑定到该变量时引发。
UnicodeError当发生与 Unicode 相关的编码或解码错误时引发。
UnicodeEncodeError在编码期间发生与 Unicode 相关的错误时引发。
UnicodeDecodeError在解码过程中发生与 Unicode 相关的错误时引发。
UnicodeTranslateError在翻译过程中发生与 Unicode 相关的错误时引发。
ValueError当函数获得类型正确但值不正确的参数时引发。
ZeroDivisionError当除法或模运算的第二个操作数为零时引发。

如果需要,我们还可以在 Python 中定义自己的异常。要了解有关它们的更多信息,请访问Python 用户定义的异常。

try我们可以使用,exceptfinally语句在 Python 中处理这些内置的和用户定义的异常。要了解有关它们的更多信息,请访问Python 的 try、except 和 finally 语句。

Python – 错误类型

Python程序中最常见的错误原因是某个语句不符合规定的用法。这种错误称为语法错误。Python 解释器会立即报告它,通常会附上原因。

示例:错误

>>> print "hello"
SyntaxError: Missing parentheses in call to 'print'. Did you mean print("hello")?

在 Python 3.x 中,print 是一个内置函数并且需要括号。上面的语句违反了这种用法,因此会显示语法错误。

很多时候,即使没有任何语法错误,程序在运行后也会导致错误。这样的错误是运行时错误,称为异常。Python 库中定义了许多内置异常。让我们看看一些常见的错误类型。

下表列出了 Python 中重要的内置异常。

Exception描述
AssertionError当 assert 语句失败时引发。
AttributeError对属性赋值或引用引发失败。
EOFError当 input() 函数达到文件结束条件时引发。
FloatingPointError当浮点操作失败时引发。
GeneratorExit在调用生成器的 close() 方法时引发。
ImportError未找到导入的模块时引发。
IndexError当序列的索引超出范围时引发。
KeyError在字典中找不到键时引发。
KeyboardInterrupt当用户按下中断键(Ctrl+c 或删除)时引发。
MemoryError当操作内存不足时引发。
NameError在本地或全局范围内找不到变量时引发。
NotImplementedError由抽象方法引发。
OSError当系统操作导致系统相关错误时引发。
OverflowError当算术运算的结果太大而无法表示时引发。
ReferenceError当弱引用代理用于访问垃圾收集的引用时引发。
RuntimeError当错误不属于任何其他类别时引发。
StopIteration由 next() 函数引发,以指示迭代器没有要返回的其他项。
SyntaxError遇到语法错误时由解析器引发。
IndentationError当缩进不正确时引发。
TabError当缩进包含不一致的制表符和空格时引发。
SystemError当解释器检测到内部错误时引发。
SystemExit由 sys.exit() 函数引发。
TypeError当函数或操作应用于不正确类型的对象时引发。
UnboundLocalError当对函数或方法中的局部变量进行引用但没有值绑定到该变量时引发。
UnicodeError当发生与 Unicode 相关的编码或解码错误时引发。
UnicodeEncodeError在编码期间发生与 Unicode 相关的错误时引发。
UnicodeDecodeError在解码过程中发生与 Unicode 相关的错误时引发。
UnicodeTranslateError在翻译过程中发生与 Unicode 相关的错误时引发。
ValueError当函数获得类型正确但值不正确的参数时引发。
ZeroDivisionError当除法或模运算的第二个操作数为零时引发。

索引错误

IndexError尝试访问无效索引处的项目时抛出 。
示例:索引错误

>>> L1=[1,2,3]
>>> L1[3]
Traceback (most recent call last):
File "<pyshell#18>", line 1, in <module>
            
L1[3]
IndexError: list index out of range

ModuleNotFoundError

ModuleNotFoundError找不到模块时抛出 。
示例:ModuleNotFoundError

>>> import notamodule
Traceback (most recent call last):
File "<pyshell#10>", line 1, in <module>
            
import notamodule
ModuleNotFoundError: No module named 'notamodule'

键错误

KeyError找不到密钥时抛出 。
示例:KeyError

>>> D1={'1':"aa", '2':"bb", '3':"cc"}
>>> D1['4']
Traceback (most recent call last):
File "<pyshell#15>", line 1, in <module>

            
D1['4']
KeyError: '4'

导入错误

ImportError找不到指定函数时抛出 。
示例:导入错误

>>> from math import cube
Traceback (most recent call last):
File "<pyshell#16>", line 1, in <module>
            
from math import cube
ImportError: cannot import name 'cube'

停止迭代

当函数超出迭代器项 StopIteration时抛出。
next()示例:停止迭代

>>> it=iter([1,2,3])
>>> next(it)
1
>>> next(it)
2
>>> next(it)
3
>>> next(it)
Traceback (most recent call last):
File "<pyshell#23>", line 1, in <module>
            
next(it)
StopIteration

类型错误

TypeError操作或函数应用于不适当类型的对象时抛出。
示例:类型错误

>>> '2'+2
Traceback (most recent call last):
File "<pyshell#23>", line 1, in <module>
            
'2'+2
TypeError: must be str, not int

值错误

ValueError函数的参数类型不合适时抛出 。
示例:值错误

>>> int('xyz')
Traceback (most recent call last):
File "<pyshell#14>", line 1, in <module>
            
int('xyz')
ValueError: invalid literal for int() with base 10: 'xyz'

名称错误

NameError找不到对象时抛出 。
示例:名称错误

>>> age
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
            
age
NameError: name 'age' is not defined

零除法错误

ZeroDivisionError除法中的第二个运算符为零时抛出 。
示例:ZeroDivisionError

>>> x=100/0
Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module>
            
x=100/0
ZeroDivisionError: division by zero

键盘中断

KeyboardInterrupt用户在程序执行期间按下中断键(通常是 Control-C)时抛出 。
示例:键盘中断

>>> name=input('enter your name')
enter your name^c
Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
            
name=input('enter your name')
KeyboardInterrupt