python学习笔记 | 异常处理
什么是异常?
异常就是程序运行时发生错误的信号(在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止)。
异常种类
在python中不同的异常可以用不同的类型(python统一了类与类型,类型即类)去标识,一个异常标识一种错误。
Python所有的错误都是从BaseException
类派生的,如Exception
类,而大部分的错误类型又是从Exception
类中派生的。常见的错误类型和继承关系看这里 👇
https://docs.python.org/3/library/exceptions.html#exception-hierarchy
AttributeError | 试图访问一个没有对象的类型,比如foo.x,但foo没有属性x |
IOError | 输入/输出异常;通常是无法打开文件 |
ImportError | 无法引入模块或包;通常是路径问题或导入名称有错 |
IndentationError | 语法错误(的子类);通常是代码没有补全或缩进 |
IndexError | 下标索引超出序列边界,比如当列表D的长度只有3时,试图访问D[4] |
KeyError | 试图访问字典中不存在的键 |
KeyboardInterrupt | Ctrl+C被按下 |
NameError | 使用一个还没声明的变量 |
SyntaxError | python代码非法,代码不能编译 |
TypeError | 传入对象类型与要求的不符合 |
ValueError | 传入一个调用者不期望的值,即使值的类型是正确的;如int(‘Mormont’) |
UnboundLocalError | 试图访问一个还未被设置的局部变量,通常是由于另有一个同名的全局变量 |
Exception | 万能异常 |
AssertionError | 断言异常 |
RecursionError | 递归异常,python默认的递归深度是很有限的(默认是1000) |
异常处理
为了保证程序的健壮性和容错性,在遇到错误时程序不会崩溃,我们需要对异常进行处理。
if
如果这个错误是可预见的,可以使用if语句在错误发生之前进行预防
lst = [1,45,2.4,'提利昂·兰尼斯特',8]
for i in lst:
if i.__class__ == str:
continue
print(int(i),end=',') # 1,45,2,8,
try…except…
如果这个错误是不可预见的,则需要用到try...except
语句。
1. 多分支异常
lst = [1, 45, 2.4, 'Tyrion Lannister', 8]
for i in lst:
try:
print(int(i), end=',')
except ValueError as e:
print(repr(e))
except IndexError as e:
print(repr(e))
except AtrributeError as e:
print(repr(e))
except Exception as e:
print(repr(e))
else:
print("") # try无异常,则执行这一句
finally:
print("") # 异常与否,都会执行这一句
2. 主动触发异常
try:
name = "Imp"
if name.__class__ == str:
raise ValueError('类型异常',i)
except ValueError as e:
print(repr(e)) # ValueError('类型异常', 'Imp')
3. 断言异常
'''格式: assert expression [, arguments]'''
try:
name = "Jaime Lannister"
assert name == "Tyrion Lannister", "name must be Jamie Lannister"
except AssertionError as e:
print(repr(e)) # AssertionError('name must be Jamie Lannister')
4. 自定义异常
class CustomError(BaseException):
def __init__(self, msg):
self.msg = msg
def __str__(self):
return self.msg
try:
raise CustomError('error')
except CustomError as e:
print(repr(e)) # CustomError('error')
class KFCError(BaseException):
def __str__(self):
return 'KFC Crazy Thursday v me ¥50.'
raise KFCError