Python 异常处理
目录
异常机制
异常指程序运行过程中出现的非正常现象,例如用户输入错误、除数为零、需要处理的文件不存在、数组下标越界等
所谓异常处理,就是指程序在出现问题时依然可以正确的执行剩余的程序,而不会因为异常而终止程序执行
python 中,引进了很多用来描述和处理异常的类,称为异常类,异常类定义中包含了该类异常的信息和对异常进行处理的方法
python 中一切都是对象,异常也采用对象的方式来处理
- 抛出异常:在执行一个方法时,如果发生异常,则这个方法生成代表该
异常的一个对象,停止当前执行路径,并把异常对象提交给解释器 - 捕获异常:解释器得到该异常后,寻找相应的代码来处理该异常
try except 结构
单个except 结构:
try:
被监控的可能引发异常的语句块
except BaseException [as e]:
异常处理语句块
BaseException可以替换成具体错误类别
多个except 结构:
try:
被监控的可能引发异常的语句块
except Exception1:
异常处理语句块1
except Exception2:
异常处理语句块2
…
except BaseException:
处理可能遗漏的异常
注意:如果Exception存在子类父类关系,先写子类
try…except…else 结构
如果try 块中没有抛出异常,则执行else 块;如果try 块中抛出异常,则执行except 块,不执行else 块
try…except…finally 结构
finally 块无论是否发生异常都会被执行;通常用来释放try 块中申请的资源
with 上下文管理
作为补充,可以通过with 上下文管理,更方便的实现释放资源的操作
with 上下文管理的语法结构如下:
with context_expr [ as var]:
语句块
with 上下文管理可以自动管理资源,在with 代码块执行完毕后自动还原进入该代码之前的现场或上下文,不论何种原因跳出with 块,不论是否有异常,总能保证资源正常释放
with open("d:/bb.txt") as f:
for line in f:
print(line)
return
return 有两种作用:结束方法运行、返回值
一般不把return 放到异常处理结构中,而是放到方法最后
常见异常
- SyntaxError: 语法错误
- NameError: 尝试访问一个没有申明的变量
- ZeroDivisionError: 除数为0错误
- ValueError: 数值错误
- TypeError: 类型错误
- AttributeError: 访问对象的不存在的属性
- IndexError: 索引越界异常
- KeyError: 字典的关键字不存在
traceback
使用traceback打印异常信息
#coding=utf-8
import traceback
try:
print("step1")
num = 1/0
except:
# traceback.print_exc()
with open("d:/a.log","a") as f:
traceback.print_exc(file=f)
自定义异常类
自定义异常类一般都是运行时异常,通常继承Exception 或其子类即可,命名一般以Error、Exception 为后缀
自定义异常由raise 语句主动抛出
class AgeError(Exception): # 继承Exception
def __init__(self, errorInfo):
Exception.__init__(self)
self.errorInfo = errorInfo
def __str__(self):
return str(self.errorInfo) + ",年龄错误!应该在1-150 之间"
if __name__ == "__main__": # 如果为True,则模块是作为独立文件运行,可以执行测试代码
age = int(input("输入一个年龄:"))
if age < 1 or age > 150:
raise AgeError(age)
else:
print("正常的年龄:", age)