目录
异常
一些常见异常类型
所有异常的父类:BaseException
KeyBoardInterrupt
Exception:NameError,ValuError,AttributeError
SystemExit
GeneratorExit
python中异常也采用对象的方式来处理
1.抛出对象
执行某个方法时,如果发生异常,则该方法生成代表该异常的一个对象,停止当前执行路径并将异常对象提交给解释器;
2.捕获异常
解释器得到该异常后,寻找相应的代码来处理异常。
try…一个except结构
最常见的异常处理结构,有异常则跳过try中异常后的代码,没有异常则不执行except后的代码
try:
被监控可能引发异常的语句块
except BaseException[as e]:
异常处理语句块
print('step0')
try:
print('step1')
a = 3/0
print('step2')
except BaseException as e:
print('step3')
print(e)
print(type(e))
#print('发生异常,0不能做除数')
print('end!!')
程序测试:环输入数字,如果不是数字则异常处理,直到输入88结束循环
while True:
try:
x = int(input('请输入一个数字:'))
print('输入的数字:',x)
if x == 88:
print('退出程序')
break
except BaseException as e:
print(e)
print('异常,输入的不是一个数字')
print('循环数字输入程序结束!')
try…多个except结构
语法结构:
try:
被监控的可能引发异常的语句
except Exception1:
处理Exception1的语句块
except Exception2:
处理Exception2的语句块
…
exception BaseException:
处理可能遗漏的异常语句块
try:
a = input('请输入被除数:')
b = input('请输入除数:')
c = float(a)/float(b)
print(c)
except ZeroDivisionError:
print('异常,除数不能为0')
except ValueError:
print('异常,不能将字符串转化为数字')
except NameError:
print('异常,变量不存在')
except BaseException as e:
print(e)
try…except…else结构
try中有异常,执行except,try中没有异常则执行else。
try:
a = input('请输入被除数:')
b = input('请输入除数:')
c = float(a)/float(b)
print(c)
pt BaseException as e:
print(e)
else:
print('商是:',c)
## try…except…finally结构
finally后的语句,无论发生异常与否,都会执行
try:
a = input('请输入被除数:')
b = input('请输入除数:')
c = float(a)/float(b)
print(c)
pt BaseException as e:
print(e)
else:
print('商是:',c)
finally:
print('我是finally中的语句,无论异常是否发生,我都执行!')
print('程序结束')
测试finally
try:
f = open('c:/a.txt','r')
content = f.readline()
print(content)
except:
print('文件未找到')
finally:
print('run in fianlly, 关闭资源')
try:
f.close()
except BaseException as e:
print(e)
print('程序运行结束!')
return语句和异常处理问题
return的作用:1,结束方法运行,返回值
不能放在try…except…else…finally中间
常见异常的解决
1.SyntaxError: 语法错误
2.NameError:尝试访问一个没有声明的变量
3.ZeroDivisionError:除数为0的错误(零初错误)
4.ValueError:数值错误
5.TypeError:类型错误
6.AttributeError:访问对象的不存在的属性
7.Indexerror:索引越界异常
8.KeyError:字典的关键字不存在
常见异常汇总
略
with上下文管理器
更方便实现释放资源操作
with 上下文管理的语法结构:
with context_expr[as var]:
语句块
trackback模块
打印异常信息
import traceback
"""
try:
print('step1')
num = 1/0
except:
traceback.print_exc()
"""
#####异常信息输出到指定文件中######
try:
print('step1')
num = 1/0
except:
with open('d:/a.txt','a') as f:
traceback.print_exc(file=f)
自定义异常类
自己定义异常类,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)