文章目录
概述
关键字:try, except, else, finally, raise
对应java:try,catch,不出现异常时执行,finally,throw
处理思想:符合要求,就继续。不符合要求,就引发异常。
而不是 出现了错误1,引发异常1或反馈。这样不可能穷举所有错误。
异常处理机制
try …except
try:
pass
except (IndexError, ValueError):
pass# 可以是输出,raise,或者执行完循环体中try前面的代码,并continue跳过本轮循环
except Exception:
#也可以直接写
#except:
print(其他异常)
else:
print("没有异常")
else
示例在上面
对于一段代码A:
放else和try里的区别:代码A不会异常时都一样,A会异常时,放try会被捕获,放else不会被dtry…except捕获
放在else和后面的区别:else可以用于打印信息-------说明没有引发异常的信息
使用finally回收资源
一定会执行,除非在except块中出现:
os.exit(1)
退出解释器
其他代码没用,比如:
return
sys.exit()
退出程序,通过引发异常来结束程序,所以还是会执行finally
尽量不要在finally中出现return
raise
正常流程:try/except,把返回值先存着 ----fnially —把try/except返回值返回去,停止
finally里面修改值不会影响try/except
但是fianlly有return,raise,则流程:try/except,把返回值先存着 ----fnially,返回,停止
最后的值和finally的return语句有关
3、使用raise引发异常
有时候异常需要程序员来引发:
因为不符合需求就是异常,而电脑不能判断
三种用法:
- 单独
- 带一个异常类
- 异常对象
在try块里面raise,可以手动引发异常
try:
if value>0:
raise ValueError("值大于0")
#raise #单独一个raise也可以
except:
pass
自定义异常类
直接继承Exception就可以了,内容一般不用写
作用是异常的名字可以更好的表示出异常类型
class AuctionException(Exception):pass
except和raise同时使用
出现了异常,在except里面不能完全处理,还要向上抛出
一般不用于主方法,因为主方法没有上级了
raise不需要参数
异常传播轨迹
没用吧。略过了
异常处理规则
目标:
混乱最小
捕获诊断信息
通知合适的人员
采取适合的方式结束异常
忠告:
不要过度使用异常
不要用很大的try块
不要忽略捕获到的异常