[oeasy]python0139_尝试捕获异常_ try_except_traceback

尝试捕获异常

回忆上次内容

  • 变量相加
    • 整型数字变量可以相加
    • 字符串变量也可以拼接
  • 但是
    • 字符串 和 整型数字
    • 整型数字 和 字符串
    • 不能相加
  • 怎么办?
    • 转格式
    • 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

图片描述

  • 这不行!!!😡
    • 异常错误不处理不行
    • 要明确得处理
    • 要明确的报错
  • 知道哪里错了
    • 才好修改
  • 如果假装没犯错
    • 就会完全没有处理线索
    • 程序大了绝对让人彻底崩溃

对应禅语

  • 错误不应被悄悄传递
    • 除非你确定需要这样做

图片描述

  • 精准地捕获异常
    • 不写 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值