代码运行可能会意外各种错误
程序的逻辑错误、用户输入不合法等都会引发异常,但它们不会导致程序崩溃
可以利用python提供的异常处理机制,在异常出现时及时捕获并从内部消化掉
代码错误类型
类名 | 描述 |
---|---|
AssertionError | 当assert语句失败时引发该异常 |
AttributeError | 对象不存在此属性 |
BaseException | 所有异常的基类 |
Exception | 常规异常的基类 |
ImportError | 当导入一个模块失败时引发该异常 |
IndexError | 序列中无此索引/下标越界 |
IOError | 输入/输出操作失败 |
KeyboardInterrupt | 用户中断执行(通常输入Ctr-C) |
KeyError | 映射中不存在此键 |
MemoryError | 内存耗尽 |
NameError | 找不到名字(变量) |
OverflowError | 当算术运算结果超出表示范围时引发该异常 |
RecursionError | 当超过最大递归深度时引发该异常 |
RuntimeError | 当产生其他所有类别以外的错误时引发该异常 |
StopIteration | 当迭代器中没有下一个可获取的元素时引发该异常 |
SyntaxError | Python语法错误 |
TabError | 当使用不一致的缩进方式时引发该异常 |
TypeError | 对类型无效的操作 |
UnboundLocalError | 引用未赋值的局部变量时引发该异常 |
ValueError | 传入无效的参数 |
ZeroDivisionError | 除(或取模)运算的第二个参数为0 |
FileExistsError | 当要创建的文件或目录已存在时引发该异常 |
FileNotFoundError | 当要访问的文件或目录不存在时引发该异常 |
错误实例举例
语法错误:SyntaxError
‘>>>print ‘bee’
SyntaxError: Missing parentheses in call to ‘print’. Did you mean print(‘bee’)?
除以0错误:ZeroDivisionError
'>>> a=0;5/a
Traceback (most recent call last):
ZeroDivisionError: division by zero
下标越界:IndexError 最为常见
这种包括列表、元组和字符串,普遍存在。
’>>> al=[1,2,3,4];al[4]
IndexError: list index out of range
类型错误:TypeError
‘>>> ls=[1,‘2’];ls.sort()
TypeError: ‘<’ not supported between instances of ‘str’ and ‘int’
访问变量不存在:NameError
引用变量前并没有赋值,包括函数、类等未定义都会引发NameError错误
’>>> x+=1
NameError: name ‘x’ is not defined
字典关键字不存在:KeyError
上述提到了下标越界错误,对字典来说,存在类似错误如上。
引发的错误还会提示不存在的关键字是什么。
‘>>> d={1:2};d[2]
Traceback (most recent call last):
KeyError: 2
未知的变量属性:AttributeError
’>>> l=[];l.sorted()
AttributeError: ‘list’ object has no attribute ‘sorted’
——
如上sorted是内置函数,列表类中不存在方法sorted
以上这些错误会引起程序中止退出,如果希望掌控意外,就需要在可能出错误的地方设置陷阱捕捉错误
异常处理
try-except-else-finally语句
try:
<检测语句>
except <错误类型> [as e]:
<处理异常>
else:
<未发生错误而运行的代码>
finally:
<无论是否发生错误都一定会运行的代码>
针对不同异常可以设置多个except,一个except多个异常项则以元组形式表示。
如果不标注错误类型,则捕捉所有的错误;如果标注错误类型,则仅捕捉该异常。
异常具有传递机制,如果调用函数中某处抛出的异常没有被捕捉处理的话就会一层层传递到上一级调用处,直到被捕捉,如果一直未被捕捉,程序就会因为异常结束。
产生错误
产生错误raise
给定一个输入input,如何控制用户输入的内容?
我们可以使用关键字raise产生异常,与while True和break组合使用来控制输入的内容。
raise关键字是用来产生异常的,一般来说需要内置的异常类型,但是也可以自行创建异常类型。
while True:
try:
a=input()
if not a.isdigit():raise ValueError
else:break
except:print('请输入纯数字!')
print('hi!')
断言assert
使用关键字assert可以判断一个条件是否成立,如果成立则继续执行后面的语句;如果不成立则会引发AssertionError异常。
while True:
try:
a=input()
assert a.isdigit()
break
except:print('请输入纯数字!')
print('hi!')
自定义异常
自定义异常,实际上就是以BaseException类作为父类创建一个子类。
class HanPiError(BaseException):
def __init__(self,a):
self.yala=a
def __str__(self):
return self.yala
while True:
try:
a=input('请输入:')
if not a.isdigit():raise HanPiError\
('输入错误,输入内容为%s,请输入纯数字!'%a)
else:break
except HanPiError as e:
print(e)
print('输入正确!')