定义
通过捕获异常的方式获取这个异常的名称,在通过其他逻辑代码让程序继续运行。根据异常做出的逻辑处理就是异常处理。
异常名称 | 描述 |
---|---|
AttributeError | 程序试图访问对象属性不存在 |
IndexError | 索引超出范围时引发 |
KeyError | 字典中查找不存在的关键字时引发 |
NameError | 访问未声明的变量时引发 |
TypeError | 不同类型数据之间的无效操作 |
ValueError | 格式转换引发,如转化数字失败,解码文件失败等 |
ArithmeticError | 数学计算引发 |
异常处理标准结构
try–except
try :
# 可能产生异常的代码块
pass
except [Exception1, Exception2, ...] [as e]:
# 异常处理代码块1
pass
except:
# 异常处理代码块2
pass
else:
#程序未发生异常时执行的代码
pass
finally:
#资源回收
pass
raise
raise Exception
可以自定义异常并返回,只要继承Exception即可。
class MyExcption(Exception):
pass
class Auction:
def __init__(self):
self.auction_price = 100
def auction(self,price):
assert price > 0, "the price should be greater than 0"
if price < self.auction_price:
raise MyExcption("Price too low")
else:
self.auction_price = price
auction = Auction()
try:
auction.auction(-10)
print("now the price is {}".format(auction.auction_price))
except AssertionError as e:
print("Assertion Error raised: " + str(e))
except MyExcption as e:
print("Exception raised: " + str(e))
assert
assert 表达式[,参数]
等价于
if 表达式==True:
程序继续执行
else:
程序报 AssertionError 错误
使用例子见上文raise部分
异常处理原则
1、只有try语句块是必须的,except,else,finally都是非必需的, except和finally至少出现一个。
2、多个except语句块,捕获父类异常的except应该处于捕获子类异常的前面。(Python会首先尝试匹配父类异常的except,如果匹配成功,那么就不会再去匹配子类异常的except)
3、except 后面不指定异常名时候,就是捕获所有异常,这种情况应该是最后一个except语句块。
4、finally语句块出现的话,就必须位于所有语句块最后。
5、捕获异常时候要保留异常信息,通知给合适的人。
6、不要使用庞大的try块
7、不要忽略捕获到的异常