- 不但要有自己的报错 - 还要保留系统的报错 - 有可能吗? ### 保留报错 ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20221029-1667047409821) - 最终结果 ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20221029-1667047424252) - 可以让报错详细一些吗? - 比如文件、行号 ### 保留报错细节 ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20221029-1667047853333) - import traceback - traceback.print_exc() ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20221029-1667047872197) ## 总结 - 这次学习了 - try - except - 注意要点 - 半角冒号 - 缩进 - 错误信息输出 - 有错就处理 - 不要忽略、隐瞒 - 否则找不到出错位置 - 还可以用traceback把 - 系统报错信息原样输出 - 但是代码量好多啊 - 10多 行了 ? - 可以把他输入部分和输出部分么?? - 我们下次再说!? - 蓝桥->https://www.lanqiao.cn/courses/3584 - github->https://github.com/overmind1980/oeasy-python-tutorial - gitee->https://gitee.com/overmind1980/oeasypython 尝试捕获异常 回忆上次内容
-
变量相加
-
整型数字变量可以相加
-
字符串变量也可以拼接
-
但是
-
字符串 和 整型数字
-
整型数字 和 字符串
-
不能相加
-
怎么办?
-
转格式
-
int("1")
-
str(2)
-
可是
-
如果输入的苹果数量是
-
字符串"abc"
-
int("abc")会发生什么???
先试试看
-
虽然我有了心理准备
-
但是 python 显然还没有准备好
-
要让 python 知道
-
什么时候可能会出错
简化问题
-
python3 的意思是
-
不知道怎么把 abc 转化为十进制数
-
不但 python3 没有办法转化
-
我也没有思路
-
有的时候数字中确实可以有 abc 的
-
比如 0xa 这种形式
-
这 0xabc 是可以转化为数字的
-
而 abc 是不能转化的
-
如何进行区分呢
思路
-
尝试转化的工作
-
出现在倒数第二行
-
total = int(a) + int(b)
-
需要做的
-
是试着 运行这一行
#!/usr/bin/python3 a = input("How many apples do you have: ") print("You have got " + a + " apples!") b = input("How many banana do you have: ") print("You have got " + b + " bananas!") total = int(a) + int(b) print("You have got " + str(total) + " fruits in all!")
-
既然 给了用户输入的 权利
-
就要处理 用户输入的错误
-
如果遇到了 不能转化的情况
-
就要处理
-
给用户 一个 明确的报错
-
怎么才能让 python3 试着运行呢?
搜索 try
-
搜索一下 python3 + try
try
-
try 就是 试着来
-
把需要试着来的代码部分放到 try 里面
-
试着 成功了
-
就继续运行 try里面的代码
-
直到完成 try中所有的代码
-
试着 失败了
-
就跳转到except部分 执行
-
这就是
-
异常的处理
试着来
-
下面的源代码
-
可以直接复制
-
系统会将两个反斜杠\\
-
转义成一个反斜杠\
#!/usr/bin/python3 a = input("How many apples do you got?\\n") print("You got " + a + " apples!") b = input("How many bananas do you got?\\n") print("You got " + b + " bananas!") try: total = int(a) + int(b) except: print("\\33[41m[error]\\33[0m -- input should be numbers!") print("You got " + str(total) + " fruits!")
-
注意
-
冒号
-
是英文半角的
-
要紧跟着 try、except
-
缩进
-
待尝试的内容需要缩进 4 个字符
-
total = int(a) + int(b)
-
所有需要try的内容都要
-
缩进
-
就像while True中需要循环的循环体
-
需要缩进一样
-
缩进距离不多不少
-
4个就很合适
尝试运行
-
运行失败了
-
成功报了错
-
原来想的是 试着执行这句
-
total = int(a) + int(b)
-
可是这句 里面
-
不但进行 类型转化
-
还声明了 一个变量 total
-
这个total
-
由于int("a") 会出现错误
-
根本没有被声明
-
而且 后面还要被引用
-
后面引用不到
-
所以报错了
-
没 try成功
-
怎么办?
再次修正
-
都放 try 里面
#!/usr/bin/python a = input("How many apples do you got?\\n") print("You got " + a + " apples!") b = input("How many bananas do you got?\\n") print("You got " + b + " bananas!") try: total = int(a) + int(b) print("You got " + str(total) + " fruits!") except: print("\\33[41m[error]\\33[0m -- input should be numbers!") 尝试
-
试试行不行
-
这次终于成功地报错了!
-
或者说我接管了相关的报错信息
-
对于这类错有了自己的处理
-
这就是捕获了异常
-
并且处理了异常
-
红颜色的 error 好扎眼
-
我把他瞒下来
-
不报错可以么?
不报错 #!/usr/bin/python a = input("How many apples do you got?\\n") print("You got " + a + " apples!") b = input("How many bananas do you got?\\n") print("You got " + b + " bananas!") try: total = int(a) + int(b) print("You got " + str(total) + " fruits!") except: pass
-
<font style="color:red;font-size:48px;">这不行!!!?</font>
-
异常错误不处理不行
-
要明确得处理
-
要明确的报错
-
知道哪里错了
-
才好修改
-
如果假装没犯错
-
就会完全没有处理线索
-
程序大了绝对让人彻底崩溃
对应禅语
-
错误不应被悄悄传递
-
除非你确定需要这样做
-
精准地捕获异常
-
不写 except:pass 风格的代码
-
那什么是 except:pass 风格的代码呢?
异常飘过
-
就是 那种知错不报错的方式
-
虽然 except接收到了错误
-
但是 轻轻飘过pass
-
上面这是错的!
-
这是最要命的
-
让人没有追踪trace的痕迹
-
无法调试debug!
-
无语问苍天?!
-
不但要有自己的报错
-
还要保留系统的报错
-
有可能吗?
保留报错
-
最终结果
-
可以让报错详细一些吗?
-
比如文件、行号
保留报错细节
-
import traceback
-
traceback.print_exc()
总结
-
这次学习了
-
try
-
except
-
注意要点
-
半角冒号
-
缩进
-
错误信息输出
-
有错就处理
-
不要忽略、隐瞒
-
否则找不到出错位置
-
还可以用traceback把
-
系统报错信息原样输出
-
但是代码量好多啊
-
10多 行了 ?
-
可以把他输入部分和输出部分么??
-
我们下次再说!?
- try_except_traceback traceback except python oeasytry_except_traceback traceback except python try_except_traceback traceback模块except try name_convention convention python oeasy 全体finally python oeasy python import_this import oeasy traceback模块python 命令python traceback不用 traceback python信息 程序python oeasy 0143