28 -3 异常、断言

异常处理

什么是异常

异常和错误的区别

  • 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):
  报错信息
View Code

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

后期写框架的时候用

不能提示用户。这是给程序员看的

原文地址:https://www.cnblogs.com/zhuangdd/p/12669784.html