尝试捕获异常
回忆上次内容
- 变量相加 
  
- 整型数字变量可以相加
 - 字符串变量也可以拼接
 
 - 但是 
  
- 字符串 和 整型数字
 - 整型数字 和 字符串
 - 不能相加
 
 - 怎么办? 
  
- 转格式
 - 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
 



















