尝试捕获异常
回忆上次内容
- 变量相加
- 整型数字变量可以相加
- 字符串变量也可以拼接
- 但是
- 字符串 和 整型数字
- 整型数字 和 字符串
- 不能相加
- 怎么办?
- 转格式
- 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里面的代码
- 直到完成 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
- 这不行!!!😡
- 异常错误不处理不行
- 要明确得处理
- 要明确的报错
- 知道哪里错了
- 才好修改
- 如果假装没犯错
- 就会完全没有处理线索
- 程序大了绝对让人彻底崩溃
对应禅语
- 错误不应被悄悄传递
- 除非你确定需要这样做
- 精准地捕获异常
- 不写 except:pass 风格的代码
- 那什么是 except:pass 风格的代码呢?
异常飘过
- 就是 那种
知错不报错
的方式- 虽然 except接收到了错误
- 但是 轻轻飘过pass
- 上面这是错的!
- 这是最要命的
- 让人没有追踪trace的痕迹
- 无法调试debug!
- 无语问苍天😭!
- 不但要有自己的报错
- 还要保留系统的报错
- 有可能吗?
保留报错
- 最终结果
- 可以让报错详细一些吗?
- 比如文件、行号
保留报错细节
- import traceback
- traceback.print_exc()
总结
-
这次学习了
- try
- except
-
注意要点
- 半角冒号
- 缩进
- 错误信息输出
-
有错就处理
- 不要忽略、隐瞒
- 否则找不到出错位置
- 还可以用traceback把
- 系统报错信息原样输出
-
但是代码量好多啊
- 10多 行了 🤯
- 可以把他输入部分和输出部分么?🤔
-
我们下次再说!👋
-
蓝桥->https://www.lanqiao.cn/courses/3584
-
github->https://github.com/overmind1980/oeasy-python-tutorial
-
gitee->https://gitee.com/overmind1980/oeasypython