异常处理
什么是异常
异常和错误的区别
- error 错误 比较明显的错误 再编译代码阶段就能检测出来
- 异常 再执行代码的过程中引发的异常
异常发生了是什么效果
如何查看报错信息
最简单的异常异常处理
pass
多分支异常处理
l = ['d','z','t'] for i in enumerate(l ,1): print(i[0],i[1]) try: num = int(input('num:')) print(l[num-1]) except ValueError: print("请输入一个数字") except IndexError: print("您输入的数字无效") #当出现ValueError、IndexError 可以很好的解决
但是异常是很多的,总部呢个全部except +异常: 把?
所以介绍一下 万能异常
try: #name dic= {} dic["key"] except Exception: # 万能异常 pass
可是上面所有异常都给你解决了。你不是抓虾吗?
所以 这样用/!
try: # name dic = {} dic["key"] except Exception as e: # e随意取,是一个对象 print(type(e), e, e.__traceback__.tb_lineno) # <class 'KeyError'> 'key' 18 (18是行数)
万能异常和其他分支合作
try: name [][3] import a except NameError: pass except IndexError: pass except Exception: pass # 万能异常永远放在最后一个except,因为上面有异常,就相应停止+报错了
异常处理的其他机制
try+except
try: name [][3] except (IndexError,NameError) as e: print(e) # name 'name' is not defined
try+except+else
try: name [][3] import a except NameError: print("name error") else: print("没有错,就执行else")
try+ except+else+finally
try: name [][3] import a except NameError: print("name error") else: print("没有错,就执行else") finally: print("无论如何都会执行我")
那finally无论如何都会执行,那有和放在平常的地方,有何区别, 有啥用?
例如打开文件 f = open(xx),最后finally 执行f.close()
居然return了后 ,还能执行我finally!?牛皮,靠谱
def func(): try: f = open('file',"w") return f.read() finally: f.close() print('执行我了,那么就等于执行finally') func() ++++++++++++++++ 执行我了,那么就等于执行finally Traceback (most recent call last): 报错信息
finally :资源回收
有这么几种组合
try/excpet
try/excpet/else/finally
try/excpet/finally
try/finally
主动抛出异常
raise TimeoutErro
try: num = int(input(">>>")) except ValueError: raise NameError # 先原封不动排除try语句出现的异常,再抛出我们设置的NameError,
自定义异常
class DdException(BaseException): # 或者继承Exception def __init__(self, msg): self.msg = msg raise DdException('这是一个X错误,有X问题') # 传入错误提示 # Exception 是祖宗能处理99%+的异常,BaseException是祖宗的祖宗 能处理全部异常
断言
assert 布尔值 # 只要是这个布尔是正确的 就往下走。错误就抛出异常 相当于下面的if else # 好处是不用缩进,只要一行代码
assert True
等于
if False: print(123) else: raise AssertionError
使用异常处理的注意事项
断言assert ;抛出异常 raise
后期写框架的时候用
不能提示用户。这是给程序员看的