异常的本质:
异常指程序运行过程中出现的非正常现象,如用户输入错误、除数为零等
Python中引进了很多用来描述和处理异常的类,成为异常类。异常类定义中包含了该类异常的信息和处理的方法
异常处理结构:
#try...expect结构
try:
被监控的可能引发异常的语句
except Exception1:
异常处理语句块
except Exception2:
异常处理语句块
...
except BaseException [as e]:
处理可能遗漏的异常的语句块
#注:应将子类放在前面优先处理,如Exception1是Exception2的子类
#例,如果没有异常,不执行except
try:
print('step1')
a = 3/0 #异常
print('step2') #不会执行,跳过
except BaseException as e: #跳到这里
print('step3')
print(e)
print('step4') #不影响执行
#try...except...else结构,如果try中有异常,执行except,如果没有异常,执行else
#例
try:
a = input('输入被除数')
b = input('输入除数')
c = float(a)/float(b)
except BaseException as e:
print(e)
else:
print('结果是', c)
print('结束')
#try...except...finally结构
#finally无论是否发生异常都会执行,通常用来释放try中的申请资源
#例
try:
a = input('输入被除数')
b = input('输入除数')
c = float(a)/float(b)
except BaseException as e:
print(e)
else:
print('结果是', c)
finally:
print('无论是否发生异常,都会执行')
print('结束')
常见的异常:
SyntaxError:语法错误
NameError:尝试访问一个没有申明的变量
ZeroDivisionError:除数为0错误
ValueError:数值错误
TypeError:类型错误
AttributeError:访问对象的不存在属性
IndexError:索引越界异常
KeyError:字典关键字不存在
with上下文管理:
比finally结构更简单,更方便实现释放资源
#with语法结构
with context_expr [as var]:
语句块
#例
with open('文件名') as f:
c = f.readline()
print(c)
print('结束')
traceback模块:
详细打印错误信息
try:
a = input('输入被除数')
b = input('输入除数')
c = float(a)/float(b)
except:
traceback.print_exc()
print('结束')
#将异常记录到文件中
try:
num = 1/0
except:
with open('文件名') as f:
traceback.print_exc(file = f)
自定义异常:
自定义异常类,通常继承Exception或其子类即可,命名一般以Error、Exception为后缀