有不少人在写 Python 代码时,喜欢用 try...except Exception
,更有甚者一层套一层,不管有没有用,先套了再说:
根本不管是否有必要,总之套上了try...except...
就有了安全感。
俄罗斯套娃套多了以后,噩梦开始了。我们来看看下面这段报错:
你倒是给我说说,是哪个函数出了问题?
如果你饱受滥用try...except...
之苦,下面三个方法可以让你脱离苦海。
把问题暴露出来
在程序开发的初期,不要用try...except...
。让 Python 把问题暴露出来。通过 Python 的报错,你可以直接看到是哪一行代码有问题,具体是什么问题。
甚至有时候,不仅不需要捕获异常,你还应该主动抛出异常。在项目完成以后,如果你做的是一个第三方库,是用来给别人调用的,那么,你应该多抛出异常,而不是擅自返回一个普通的错误信息。
例如,你要实现一个函数:query_name
,传入参数是数字 id,输出用户名。你可能会这样写:
但实际上,更好的做法是,直接抛出一个异常:
甚至在某些情况下,你可以使用 Python 的断言
:
如下图所示:
只要 user_id
不是整型,就抛出AssertionError
。
我们直接执行python3 xxx.py
时,这些断言语句会正常工作。但我们可以通过python3 -O xxx.py
来让所有assert xxx
语句失效。
尽量早地让异常暴露出来,才能更早地解决问题。
捕获具体异常而不是所有异常
只捕获你明确知道的异常。这些异常你知道它为什么会出现,并且你知道应该怎么解决它。
例如,我们使用requests
请求网站,由于网络问题,有时候可能会请求超时。一旦超时 requests 就会抛出超时异常,如下图所示:
这种情况下,你知道这个地方可能会出现Timeout
异常,并且你知道出现的时候,重试就可以了。于是,你可以捕获这个异常:
大家注意,在这个地方,requests 执行了.json()
方法。如果URL 返回的内容可能不是 JSON 格式的字符串,这里就会报JSONDecodeError
,如下图所示:
如果你不做区分,一股脑直接用 except Exception
,那么你怎么知道,到底是你能够正常处理的超时问题,还是你不能正常处理的网站内容返回异常?
所以,只捕获你知道它为什么会发生并且你知道如何处理的异常。对于你无法预料的或者无法处理的异常,直接抛出。不要擅自捕获。
强行打印报错信息
如果实在是万不得已,你必须用try...except Exception
,如何把具体报错的位置打印出来呢?其实也是有方法的。那就是使用 Python 自带的traceback
模块。
它的用法非常简单:
运行效果如下图所示:
成功把异常所在的行数和具体的错误类型打印了出来。显然,这样写你需要平白无故多写很多代码。
总结
try...except...
会让你的代码看起来没有问题,但也有可能会掩盖问题,让你无法发现哪里有问题。所以,从看了这篇文章开始,删除不必要的try...except...
。
拥抱异常,让你无法处理的异常抛出来。程序出现了问题应该停止运行,而不是带着问题继续运行,这样可能会演变成更大的问题。
<p><strong>近期热门:</strong><br /></p><p style="margin-top: 10px;margin-bottom: 5px;padding-right: 0em;padding-left: 0em;color: rgb(0, 0, 0);font-family: -apple-system-font, system-ui, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;white-space: normal;widows: 1;word-spacing: 10px;letter-spacing: 1.5px;line-height: normal;"><span style="color: rgb(0, 122, 170);"><span style="font-size: 16px;">● </span><span style="font-size: 16px;text-decoration: underline;">80%的人都不知道,全球Python库下载前10名</span></span></p><p style="margin-top: 10px;margin-bottom: 5px;padding-right: 0em;padding-left: 0em;color: rgb(0, 0, 0);font-family: -apple-system-font, system-ui, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;white-space: normal;widows: 1;word-spacing: 10px;letter-spacing: 1.5px;line-height: normal;">● 我珍藏的一些好的Python代码,技巧|上篇</p><p style="margin-top: 10px;margin-bottom: 5px;padding-right: 0em;padding-left: 0em;color: rgb(0, 0, 0);font-family: -apple-system-font, system-ui, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;white-space: normal;widows: 1;word-spacing: 10px;letter-spacing: 1.5px;line-height: normal;"><span style="color: rgb(0, 122, 170);"><span style="font-size: 16px;">● </span><span style="font-size: 16px;text-decoration: underline;">爬取300本Python书籍,用Python告诉你哪家强?</span></span></p><section style="margin-top: 10px;margin-bottom: 5px;padding-right: 0em;padding-left: 0em;color: rgb(0, 0, 0);font-family: -apple-system-font, system-ui, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;white-space: normal;widows: 1;word-spacing: 10px;letter-spacing: 1.5px;line-height: normal;"><span style="color: rgb(0, 122, 170);"><span style="font-size: 16px;">● </span><span style="font-size: 16px;text-decoration: underline;">简单几步,100行代码用Python画一个蝙蝠侠的logo</span></span></section><section style="margin-top: 10px;margin-bottom: 5px;padding-right: 0em;padding-left: 0em;color: rgb(0, 0, 0);font-family: -apple-system-font, system-ui, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;white-space: normal;widows: 1;word-spacing: 10px;letter-spacing: 1.5px;line-height: normal;"><span style="color: rgb(0, 122, 170);"><span style="font-size: 16px;">● </span><span style="font-size: 16px;text-decoration: underline;">我用Python分析了《青春有你2》109位漂亮小姐姐,真香!</span></span></section><section style="margin-top: 10px;margin-bottom: 5px;padding-right: 0em;padding-left: 0em;color: rgb(0, 0, 0);font-family: -apple-system-font, system-ui, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;white-space: normal;widows: 1;word-spacing: 10px;letter-spacing: 1.5px;line-height: normal;"><span style="color: rgb(0, 122, 170);font-size: 16px;">● </span><span style="font-size: 16px;color: rgb(0, 122, 170);text-decoration: underline;">牛逼操作!用Python做了一个编程语言20年的动态排行榜!</span></section><section style="margin-top: 10px;margin-bottom: 5px;padding-right: 0em;padding-left: 0em;color: rgb(0, 0, 0);font-family: -apple-system-font, system-ui, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;white-space: normal;widows: 1;word-spacing: 10px;letter-spacing: 1.5px;line-height: normal;"><span style="color: rgb(0, 122, 170);font-size: 16px;">● </span><span style="color: rgb(0, 122, 170);text-decoration: underline;font-size: 16px;">我打赌,学会这6招,谁再敢笑你的Python程序慢!</span></section><section style="margin-top: 10px;margin-bottom: 5px;padding-right: 0em;padding-left: 0em;color: rgb(0, 0, 0);font-family: -apple-system-font, system-ui, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;white-space: normal;widows: 1;word-spacing: 10px;letter-spacing: 1.5px;line-height: normal;"><br /></section><section style="margin-top: 10px;margin-bottom: 5px;padding-right: 0em;padding-left: 0em;color: rgb(0, 0, 0);font-family: -apple-system-font, system-ui, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;white-space: normal;widows: 1;word-spacing: 10px;letter-spacing: 1.5px;line-height: normal;"><span style="font-size: 15px;word-spacing: 2px;caret-color: rgb(62, 62, 62);letter-spacing: 0.544px;color: rgb(255, 41, 65);"><strong><span style="border-color: rgb(127, 127, 127);">点击阅读原文,原创400篇干货文章</span></strong></span></section>
本篇文章来源于: 菜鸟学Python
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 程序员小猪队友行为大赏04/24
- ♥ Python open函数详解:打开指定文件10/19
- ♥ python输入三个数字求平均值08/25
- ♥ Python如何根据输入参数计算结果12/08
- ♥ 如何在python中打开文件10/31
- ♥ python中设置了什么09/02
内容反馈