异常处理之后做些什么_try语句的完全体_最终_finally 回忆上次内容
我们了解了 try 的细节
except 可以 捕获到异常
但报错比较简单
游乐场里面的 报错
更全 更丰富
还告诉哪个文件、第几行
可以跟踪到最详细报错信息 吗?🤔
报错信息
可以输出完整的报错信息吗?
包含文件和行号那种的详细信息
运行结果
告诉了我们
t.py 第1行
发生了 NameError
询问ai
修改
导入
trackback模块
获得 跟踪信息
import traceback try: a except: print("in except---------") traceback.print_exc() print("in except=========")
运行结果
不但保留了系统的报错
还把错误位置也指出了
应该 如何理解 traceback中的
print_exc函数呢?
游乐场
traceback 是 模块(module)
import traceback
引入 这个模块(module)
traceback.print_exc
.(点)的意思 是 里面的
traceback 里面的 print_exc
作用是输出异常信息
try 语句当中
除了 except 和 else 之外
还有其他子句 吗?
finally
try 之后分支
要么 执行中 捕获到了异常
立即停止 try中的部分
跳入 对应的except 执行
要么 try全部执行完
也 没有捕获到异常
执行 else 子句
无论是except 还是 else
最后 总要执行finally 子句
finally
finally
是一个收尾的语句
import traceback try: i = int("123") j = i / 0 except ValueError: print(ValueError) except NameError: print(NameError) except Exception as e: traceback.print_exc() else: print("Nothing Wrong") finally: print("At Last...finally...")
结果
finally的帮助 help("try")
如果执行过程中
还有 任何的异常 没有被处理
那么就 把这个异常 临时存住
等finally执行之后
再抛出 这个异常
如果遇到return break continue之类 强制跳转语句
这个异常 就 被忽略了
saved exception re-raised
这如何理解?
最后再抛异常 try: a except ValueError: print(ValueError) else: print("Nothing Wrong") finally: print("finally----------")
运行结果
except 子句 处理不来 NameError
把这个 Error 先存着
跳过else
进入finally
finally 执行后
再把 这个Error
直接 抛给 系统
再看一个例子
理解finally
try里面
第2行 出现错误 abc无法转化为整型变量
ValueError
不执行后面的
d = i / 0
直接 跳到except
try: i = int("abc") d = i / 0 except ZeroDivisionError: print(ZeroDivisionError) else: print("Nothing Wrong") finally: print("At last...")
except中
处理不来 ValueError
于是ValueError就存着
由于出现了Error
已经进入了except部分
无法进入else
最后进入finally执行
输出了At Last
执行完finally语句块
才把这个ValueError最后抛出来
这是finally的执行逻辑
最终 收尾
有什么实践中的例子吗?
应用场景
下图是
python连接数据库的类库
psycopg
try的具体应用
如果都成功 就 提交(commit)
如果失败 就 回滚(rollback)
无论成功失败 最后都要 断开连接
finally 就像python 中的
Guido一样
最终决策
仁慈的独裁者BDFL
彻底的仁慈
意味着 没有主见和行动力下降
彻底的独裁
则会 失去广泛的帮助
仁慈和独裁
像是 矛盾的两面
但是
Guido却 很好地 平衡了两者
除了 Guido之外
很多 开源项目的 老大
也有 类似的称号
Guido是
如何成长的呢?
扩展视野
Guido 利用假期去
当时 it的 潮头
美国硅谷
做 一些WorkShop实践课程
推广python
很早 接触到了
互联网的 发展趋势
互联网
Guido做了
一个浏览器grail
网络集聚
网络的能量越来大
这 为python的发展 做了很好的准备
媒介
从报纸、杂志、电视
发展到邮件、论坛和浏览器
有人 就有 应用
有应用 就更有 人
于是会形成 正反馈
有了社区 就会有更多的人 加入社区
其实学编程 也是一样
越熟练 就会越自信
越自信 也就会越熟练
Guido 作为 finally
人很多 之后
众说纷纭
往往需要
一个最终的决策
finally
Guido 完成决策
决策并不是为了显示
自己权威的位置
所有者 的权限
那样会 让开发者远离 python项目
决策 是因为
Guido 比任何人 都更 了解项目
对于决策 都能做出 合理的解释
水瓶座出 生的Guido
注重 社群的力量
水瓶座时代
2023年
冥王星 将从摩羯座 进入 水瓶座
将迎来 20年左右的 转折窗口
我们人类社会 开始转变
地球 迎来了 水瓶座时代
个人更着重于
自身内在精神灵性方面的 成长
不再执着于 外在物质欲望的 享受
水瓶座象征的是集体、群众和社区
意味着乐于喜悦服务他人
我们的 人际关系、生活方式 将发生重大变化
人类的集体意识会逐渐提升
可以更容易 连结智慧本源 以及 更高维度的世界
科学技术、人道主义及公正平等
模式创新、理想社会
将会是全球议题中的 重中之重
地球环境趋于恶化,气候多变
全球变暖,能源安全变得极为重要
人类应用高科技对空气、水以及土壤进一步改造会变得困难
并且加剧了 全球环境恶化
总结
我们了解了 try 的完全体
try
尝试运行
except
发现异常时运行的代码块
else
没有发现异常时运行的代码块
finally
无论是否发现异常最终都要运行的代码块
为什么print函数
不用声明和导入?🤔
直接就能用呢?🤔
我们下次再说!👋
蓝桥->https://www.lanqiao.cn/courses/3584
github->https://github.com/overmind1980/oeasy-python-tutorial
gitee->https://gitee.com/overmind1980/oeasypython