7.2 异常(exceptions)
在Python代码通过解释但是在执行时遇到的问题一般称为异常
。程序虽然通过了解释器的解释阶段,但是在执行阶段出现了问题,如果不进行处理,那么程序很可能就无法达到我们的预期。
7.2.1 什么是异常
如前面所述,虽然Python代码通过了解释,但是在执行时仍有可能触发错误,而这类的错误就称为异常
。大部分异常会导致程序无法继续执行。
一旦程序运行后发现有异常,Python会直接显示异常的信息,通常包括:异常出现的地方、异常的类型和内容。
如下:
>>> 10 * (1/0)
Traceback (most recent call last):
File “”, line 1, in
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback (most recent call last):
File “”, line 1, in
NameError: name ‘spam’ is not defined
>>> ‘2’ + 2
Traceback (most recent call last):
File “”, line 1, in
TypeError: can only concatenate str (not “int”) to str
我们可以看到上述示例中的异常类型依次是:ZeroDivisionError, NameError 和 TypeError。
7.2.2 常见的异常类型
在Python中类似这种的异常还有很多种,下面按照新手遇到的频率由大到小列举一下Python中最常见的几种异常类型。
7.2.2.1 类型错误(TypeError)
在程序中使用不正确或不受支持的对象类型时,会引发该错误。
异常示例TypeError
def 求平方():
x = input('请输入:')
print('x的平方是:')
print(x * x)
求平方()
请输入:20
x的平方是:
Traceback (most recent call last):
File “E:\BaiduNetdiskWorkspace\FrbPythonFiles\study\test1.py”, line 7, in
求平方()
File “E:\BaiduNetdiskWorkspace\FrbPythonFiles\study\test1.py”, line 4, in 求平方
print(x * x)
TypeError: can’t multiply sequence by non-int of type ‘str’
异常说明
由于通过input函数获取到的结果是str类型,如果尝试运算str*str就会报类型错误了:
TypeError: can’t multiply sequence by non-int of type ‘str’
7.2.2.2 变量名错误(NameError)
变量名错误也是新手最容易遇到的错误之一。在Python变量名的命名中是有一套规则的。如果在Python的运行中找不到某个变量(在赋值之前就直接使用)就会报这个NameError。
异常示例NameError
>>> print(a)
Traceback (most recent call last):
File “E:\BaiduNetdiskWorkspace\FrbPythonFiles\study\test1.py”, line 1, in
print(a)
NameError: name ‘a’ is not defined
异常说明
上面的代码中,没有定义a,就直接尝试用print函数输出a了。于是Python就报错:
NameError: name ‘a’ is not defined(a没有被定义) 。
7.2.2.3 索引错误(IndexError)
我们在可迭代对象章节中讲到了一些序列对象,比如列表、字符串等。这些数据类型不仅能够可迭代还有顺序,于是可以通过索引获取对象中的值。但是如果索引出现错误,就会报这个:IndexError
异常示例IndexError
lst = [9]
print(lst[1])
Traceback (most recent call last):
File “E:\BaiduNetdiskWorkspace\FrbPythonFiles\study\test1.py”, line 2, in
print(lst[1])
IndexError: list index out of range
异常说明
这应该是编程新手最容易犯的一个错误了。在一般的编程中,序列的第一号元素的索引是0,而不是1。于是在这里我们如果尝试想获取第一个元素就应该通过索引0
来获取而不是1
。
7.2.2.4 值错误(ValueError)
当方法接收正确数据类型但值不合适的参数时,将引发Python中的ValueError异常。
异常示例ValueError
>>> int(‘1s’)
Traceback (most recent call last):
File “E:\BaiduNetdiskWorkspace\FrbPythonFiles\study\test1.py”, line 1, in
int(‘1s’)
ValueError: invalid literal for int() with base 10: ‘1s’
异常说明
虽然int函数可以接收str类型的数据,但是显然1s
不能转换成数字,于是Python报错:
ValueError: invalid literal for int() with base 10: ‘1s’
7.2.2.5 键错误(KeyError)
在通过key索引的方式获取字典中的数据时,如果key不存在,就会触发KeyError错误。
异常示例KeyError
d = {
'a': 1, 'b': 2}
print(d['c'])
Traceback (most recent call last):
File “E:\BaiduNetdiskWorkspace\FrbPythonFiles\study\test1.py”, line 2, in
print(d[‘c’])
KeyError: ‘c’
异常说明
由于字典d中只有两个键值对,他们的key分别是a和b,不存在c,于是当我们尝试通过c索引获取到c的值时就会报KeyError。
7.2.2.6 属性错误(AttributeError)
尝试调用一个对象不存在的属性时就会报该错误。
异常示例AttributeError
class myclass:
def __init__(self):
self.x = 1
mc = myclass()
print(mc.y)
Traceback (most recent call last):
File “E:\BaiduNetdiskWorkspace\FrbPythonFiles\study\test1.py”, line 7, in
print(mc.y)
AttributeError: ‘myclass’ object has no attribute ‘y’
异常说明
在定义myclass时只定义了一个x属性,没有定义y属性,调用不存在的y属性后就报错了:AttributeError: ‘myclass’ object has no attribute ‘y’
7.2.3 Python中所有自带异常类型
异常名称 | 描述 |
---|---|
BaseException | 所有异常的基类 |
SystemExit | 解释器请求退出 |
KeyboardInterrupt | 用户中断执行(通常是输入^C) |
Exception | 常规错误的基类 |
StopIteration | 迭代器没有更多的值 |
GeneratorExit | 生成器(generator)发生异常来通知退出 |
StandardError | 所有的内建标准异常的基类 |
ArithmeticError | 所有数值计算错误的基类 |
FloatingPointError | 浮点计算错误 |
OverflowError | 数值运算超出最大限制 |
ZeroDivisionError | 除(或取模)零(所有数据类型) |
AssertionError | 断言语句失败 |
AttributeError | 对象没有这个属性 |
EOFError | 没有内建输入,到达EOF标记 |
EnvironmentError | 操作系统错误的基类 |
IOError | 输入/输出操作失败 |
OSError | 操作系统错误 |
WindowsError | 系统调用失败 |
ImportError | 导入模块/对象失败 |
LookupError | 无效数据查询的基类 |
IndexError | 序列中没有此索引(index) |
KeyError | 映射中没有这个键 |
MemoryError | 内存溢出错误(对于Python解释器不是致命的) |
NameError | 未声明/初始化对象(没有属性) |
UnboundLocalError | 访问未初始化的本地变量 |
ReferenceError | 弱引用(Weakreference)试图访问已经垃圾回收了的对象 |
RuntimeError | 一般的运行时错误 |
NotImplementedError | 尚未实现的方法 |
SyntaxError | Python语法错误 |
IndentationError | 缩进错误 |
TabError | Tab和空格混用 |
SystemError | 一般的解释器系统错误 |
TypeError | 对类型无效的操作 |
ValueError | 传入无效的参数 |
UnicodeError | Unicode相关的错误 |
UnicodeDecodeError | Unicode解码时的错误 |
UnicodeEncodeError | Unicode编码时错误 |
UnicodeTranslateError | Unicode转换时错误 |
Warning | 警告的基类 |
DeprecationWarning | 关于被弃用的特征的警告 |
FutureWarning | 关于构造将来语义会有改变的警告 |
OverflowWarning | 旧的关于自动提升为长整型(long)的警告 |
PendingDeprecationWarning | 关于特性将会被废弃的警告 |
RuntimeWarning | 可疑的运行时行为(runtimebehavior)的警告 |
SyntaxWarning | 可疑的语法的警告 |
UserWarning | 用户代码生成的警告 |