楼主: CDA网校
429 0

[CDA数据分析师学习之路] Python异常处理千万别这么干 [推广有奖]

管理员

已卖:189份资源

泰斗

2%

还不是VIP/贵宾

-

威望
3
论坛币
115387 个
通用积分
9881.2207
学术水平
268 点
热心指数
276 点
信用等级
243 点
经验
227729 点
帖子
6860
精华
19
在线时间
4366 小时
注册时间
2019-9-13
最后登录
2025-12-22

初级热心勋章

楼主
CDA网校 学生认证  发表于 2022-4-20 16:34:35 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
作者:麦叔

来源:麦叔编程

脆弱的程序
如果程序不做任何异常处理,就会非常脆弱,任何一点小的问题,都会让它崩溃。

比如这个程序:

while True:
    number = input('输入一个数字:') print(int(number)/2)
只要输入的不是数字,它就马上崩溃了:

输入一个数字:9527
4763.5
输入一个数字:hello
Traceback (most recent call last): File "/Users/maishu/git/wx_maishucode/code/092.py", line 4, in <module>
    print(int(number)/2)
ValueError: invalid literal for int() with base 10: 'hello'
异常处理让它健壮
针对这种情况,我们可以使用异常处理,捕获可以预知异常,那就健壮了。

while True: try:
        number = input('输入一个数字:')
        print(int(number)/2) except ValueError:
        print('请输入正确的数字')
就算输入的不是数字,也可以从容应对不崩溃:

输入一个数字:9527
4763.5 输入一个数字:hello 请输入正确的数字
输入一个数字:9528
4764.0 输入一个数字:
在这里我们用异常捕捉的是ValueError,一种特定类型的错误。

如果会抛出其他错误,程序还是会退出的。这正是我们需要的!

做个类比:



你有一个下属,你希望他有一定的处理问题能力,不要随便有点事情都来找你哭诉。

但是如果出了大事,你还是希望它汇报给你的!



我们希望程序能够按照我们的设定处理相关的异常。如果出现未知的情况,我们希望程序报错给我们,程序员做相应的处理。

这种异常处理让它变成怪物
在上面的代码中,如果我们不指定ValueError,而是直接写except:,也就是这样:

while True: try:
        number = input('输入一个数字:')
        print(int(number)/2) except:
        print('请输入正确的数字')
结果会怎样呢?看执行结果:

输入一个数字:9527
4763.5 输入一个数字:hello 请输入正确的数字
输入一个数字:dfs 请输入正确的数字
输入一个数字:^C请输入正确的数字
输入一个数字:^C请输入正确的数字
输入一个数字:^C请输入正确的数字
输入一个数字:^C请输入正确的数字
输入一个数字:^C请输入正确的数字
输入一个数字:^C请输入正确的数字
输入一个数字:^C请输入正确的数字
输入一个数字:^C请输入正确的数字
这个程序很健壮,输入hello不会有错。

但是,当我用Ctrl +C尝试退出程序的时候,「它不能退出了!!」

你是否碰到过一些程序,怎么关都关不掉?就是这么个效果。现在只有通过任务控制器去杀死进程。

这是因为:



空的except:语句会捕获所有异常,而退出程序也是一种异常,也被捕捉,造成无法退出程序。



健壮又不成为怪物应该怎样写?
如果我们想要很健壮,但又不那么变态,我们可以捕捉Exception类,而不是空的except:语句,也就是这样:

while True: try:
        number = input('输入一个数字:')
        print(int(number)/2) except Exception as e:
        print(f'出错了:{e}')
运行结果:

输入一个数字:9527
4763.5
输入一个数字:hello
出错了:invalid literal for int() with base 10: 'hello' 输入一个数字:88.6 出错了:invalid literal for int() with base 10: '88.6' 输入一个数字:^CTraceback (most recent call last): File "/Users/maishu/git/wx_maishucode/code/092.py", line 4, in <module> number = input('输入一个数字:')
KeyboardInterrupt
原因如下:

Exception是大部分常见异常的父类,什么ValueError, KeyError等都是它的子孙,都会被捕捉到。这样程序比较健壮。
但Exception并不是系统异常的父类,比如KeyboardInterrupt等并不是继承自它,所以不会被它捕捉。当我通过键盘告诉程序要停止时,可以正常退出。
作为人,应该怎么做异常处理?
异常处理如人生,作为人我们应该怎么做呢?好难!

编辑推荐
1、2022年300个以上最佳免费数据科学课程
2、大厂数据分析面试指南!来自亚马逊、谷歌、微软、头条、美团的面试问题!
3、机器学习模型方法总结
4、历史最全机器学习/深度学习/人工智能专业术语表中英对照表
5、机器学习如何应用于商业场景?三个真实的商业项目
6、数据工作者的自我修养 | 哪些技能是必不可少的?
7、《汗牛充栋:数据分析书籍分享》CDA网校新课上线
8、文本挖掘常用的107个语料库
9、一图读懂“东数西算”工程
10、零基础转行数据分析,看这篇文章就够了

DA内容精选

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:python 异常处理 exception Keyboard invalid

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-22 15:07