前言
要用到捕捉异常,所以搜了一下顺带分享.
参考来自 Lapland Stark 大神的分享
还有来自 ZiHuiJin 大神的分享
知识点:
try:
#可能有异常的代码段
except errorname1: #前面有try发生异常后寻找except后面的异常类型
#处理异常的代码1
except errorname2: #如果上面的异常类型不是正在发生的类型就继续寻找下一个except
#处理异常的代码2
else:
#如果程序没发生异常执行的代码
finally: #抓到抓不到都会执行下面的代码
#注定会执行的代码
#可以有多个except最少一个
#finally可有可无
#异常类型errorname的名字不能随便取
#errorname是系统定义的,自己也可以用class来继承定义(呵呵,这个我不会)
下面的l_error是我自己弄的字典,
如果不认识异常类型可以用来查看中文释义.
后面的代码中有引用这个字典,
要使用下面代码中的try语句,又用不上这个字典的时候,
记的自行清理(避免bug叠bug)
l_error={
'BaseException':'所有异常的基类',
'KeyboardInterrupt':'用户中断执行(通常是输入^C)',
'Exception':'常规错误的基类',
'StopIteration':'迭代器没有更多的值',
'GeneratorExit':'生成器(generator)发生异常来通知退出',
'SystemExit':'Python 解释器请求退出',
'StandardError':'所有的内建标准异常的基类',
'ArithmeticError':'所有数值计算错误的基类',
'FloatingPointError':'浮点计算错误',
'OverflowError':'数值运算超出最大限制',
'ZeroDivisionError':'除(或取模)零 (所有数据类型)',
'AssertionError':'断言语句失败',
'AttributeError':'对象没有这个属性',
'EOFError':'没有内建输入,到达EOF 标记',
'EnvironmentError':'操作系统错误的基类',
'IOError':'输入/输出操作失败',
'OSError':'操作系统错误',
'WindowsError':'系统调用失败',
'ImportError':'导入模块/对象失败',
'KeyboardInterrupt':'用户中断执行(通常是输入^C)',
'LookupError':'无效数据查询的基类',
'IndexError':'序列中没有没有此索引(index)【越界】',
'KeyError':'映射中没有这个键',
'MemoryError':'内存溢出错误(对于Python 解释器不是致命的)',
'NameError':'未声明/初始化对象 (没有属性)',
'UnboundLocalError':'访问未初始化的本地变量',
'ReferenceError':'弱引用(Weak reference)试图访问已经垃圾回收了的对象',
'RuntimeError':'一般的运行时错误',
'NotImplementedError':'尚未实现的方法',
'SyntaxError':'Python 语法错误',
'IndentationError':'缩进错误',
'TabError':'Tab 和空格混用',
'SystemError':'一般的解释器系统错误',
'TypeError':'对类型无效的操作',
'ValueError':'传入无效的参数',
'UnicodeError':'Unicode 相关的错误',
'UnicodeDecodeError':'Unicode 解码时的错误',
'UnicodeEncodeError':'Unicode 编码时错误',
'UnicodeTranslateError':'Unicode 转换时错误',
'Warning':'警告的基类',
'DeprecationWarning':'关于被弃用的特征的警告',
'FutureWarning':'关于构造将来语义会有改变的警告',
'OverflowWarning':'旧的关于自动提升为长整型(long)的警告',
'PendingDeprecationWarning':'关于特性将会被废弃的警告',
'RuntimeWarning':'可疑的运行时行为(runtime behavior)的警告',
'SyntaxWarning':'可疑的语法的警告',
'UserWarning':'用户代码生成的警告'}
i=21
#-------------字典是无序的,用序号来取值会不会太危险?!---------------
print(f'l_error字典的第{i+1}个值:',l_error[list(l_error.keys())[i]])
print('\n---------------one----------------------------')
try: #主动抛出异常(名字随便拿一个)
print('哈利波特骑着扫帚飞')
raise NameError('而我的error,却只能清理垃圾堆')
except NameError as w: #自己抛完了自己抓
print("sorry sorry",repr(w))
lis = [1,2,3]
print('\n---------------two----------------------------')
#前面的raise后面是errorname('异常信息') 用括号存放异常信息
#下边是assert 断言内容 ,'异常信息' 用逗号存放异常信息
#(异常信息是可以省略的)
try: #捕捉assert抛出的AssertionError
assert len(lis)==4,'你瞅啥!' #逻辑为False时触发AssertionError
except AssertionError as w:
print('瞧一瞧看一看了啊!\n这就是传说中的assert抛出的error:\n',
repr(w),'\n 瞅你咋地!\n',l_error['AssertionError'])
print('\n异常外的测试: ',list) #前面捕捉了所以这一句能执行
print('\n---------------three--------------------------')
try: #捕捉name error
dir(li)
except NameError as w:
print("事先要取名字哦^_^,这都成黑户了.",repr(w))
print('\n异常外的测试: ',lis)
print('\n----------------four--------------------------')
try: #对象无属性的异常
list.a
except AttributeError:
print('小样!穿个马甲我就不认识你啦!\n你是:',l_error['AttributeError'])
finally:
#抓不到也执行(寻找一线生机)(处理非常重要的东西)(挽救点啥)(拉上一个垫背的!)
print("跳出三界外!不在五行中!->finally")
print('\n完了芭比Q了!')
l_error字典的第22个值: 映射中没有这个键
---------------one----------------------------
哈利波特骑着扫帚飞
sorry sorry NameError('而我的error,却只能清理垃圾堆')
---------------two----------------------------
瞧一瞧看一看了啊!
这就是传说中的assert抛出的error:
AssertionError('你瞅啥!')
瞅你咋地!
断言语句失败
异常外的测试:
---------------three--------------------------
事先要取名字哦^_^,这都成黑户了. NameError("name 'li' is not defined")
异常外的测试: [1, 2, 3]
----------------four--------------------------
小样!穿个马甲我就不认识你啦!
你是: 对象没有这个属性
跳出三界外!不在五行中!->finally
完了芭比Q了!
这是来自 lady_killer9 大神的总结