温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Python中怎么避免滥用try...except

发布时间:2021-11-02 16:00:16 来源:亿速云 阅读:210 作者:iii 栏目:编程语言

这篇文章主要讲解了“Python中怎么避免滥用try...except”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python中怎么避免滥用try...except”吧!

有不少人在写 Python 代码时,喜欢用 try...except Exception,更有甚者一层套一层,不管有没有用,先套了再说:

鸿蒙官方战略合作共建——HarmonyOS技术社区ss="dp-xml">ss="alt">def func(): ss="">    try: ss="alt">        "函数内部代码" ss="">    except Exception as e: ss="alt">        print('函数错误:', e) ss=""> ss="alt"> ss="">try: ss="alt">    func() ss="">except Exception as e: ss="alt">    print('函数错误:', e)

根本不管是否有必要,总之套上了try...except...就有了安全感。

俄罗斯套娃套多了以后,噩梦开始了。我们来看看下面这段报错:

Python中怎么避免滥用try...except

你倒是给我说说,是哪个函数出了问题?

如果你饱受滥用try...except...之苦,下面三个方法可以让你脱离苦海。

把问题暴露出来

在程序开发的初期,不要用try...except...。让 Python 把问题暴露出来。通过 Python  的报错,你可以直接看到是哪一行代码有问题,具体是什么问题。

甚至有时候,不仅不需要捕获异常,你还应该主动抛出异常。在项目完成以后,如果你做的是一个第三方库,是用来给别人调用的,那么,你应该多抛出异常,而不是擅自返回一个普通的错误信息。

例如,你要实现一个函数:query_name,传入参数是数字 id,输出用户名。你可能会这样写:

鸿蒙官方战略合作共建——HarmonyOS技术社区ss="dp-xml">ss="alt">def query_name(user_id): ss="">    if not isinstance(user_id, int): ss="alt">        return {'success': False, 'msg': '用户 id 必须是整型'} ss="">    ...

但实际上,更好的做法是,直接抛出一个异常:

鸿蒙官方战略合作共建——HarmonyOS技术社区ss="dp-xml">ss="alt">def query_name(user_id): ss="">    if not isinstance(user_id, int): ss="alt">        raise Exception('用户 id 必须是整型'} ss="">    ...

甚至在某些情况下,你可以使用 Python 的断言:

鸿蒙官方战略合作共建——HarmonyOS技术社区ss="dp-xml">ss="alt">def query_name(user_id): ss="">    assert isinstance(user_id, int), '用户 id 必须是整型' ss="alt">    ...

如下图所示:

Python中怎么避免滥用try...except

只要 user_id不是整型,就抛出AssertionError。

我们直接执行python3 xxx.py时,这些断言语句会正常工作。但我们可以通过python3 -o xxx.py来让所有assert  xxx语句失效。

尽量早地让异常暴露出来,才能更早地解决问题。

捕获具体异常而不是所有异常

只捕获你明确知道的异常。这些异常你知道它为什么会出现,并且你知道应该怎么解决它。

例如,我们使用requests请求网站,由于网络问题,有时候可能会请求超时。一旦超时 requests 就会抛出超时异常,如下图所示:

Python中怎么避免滥用try...except

这种情况下,你知道这个地方可能会出现Timeout异常,并且你知道出现的时候,重试就可以了。于是,你可以捕获这个异常:

Python中怎么避免滥用try...except

大家注意,在这个地方,requests 执行了.json()方法。如果URL 返回的内容可能不是 JSON  格式的字符串,这里就会报JSONDecodeError,如下图所示:

Python中怎么避免滥用try...except

如果你不做区分,一股脑直接用 except  Exception,那么你怎么知道,到底是你能够正常处理的超时问题,还是你不能正常处理的网站内容返回异常?

所以,只捕获你知道它为什么会发生并且你知道如何处理的异常。对于你无法预料的或者无法处理的异常,直接抛出。不要擅自捕获。

强行打印报错信息

如果实在是万不得已,你必须用try...except Exception,如何把具体报错的位置打印出来呢?其实也是有方法的。那就是使用  Python 自带的traceback模块。

它的用法非常简单:

鸿蒙官方战略合作共建——HarmonyOS技术社区ss="dp-xml">ss="alt">import traceback ss=""> ss="alt">try: ss="">    1 + 'a' ss="alt">except Exception: ss="">    print(traceback.format_exc())

运行效果如下图所示:

Python中怎么避免滥用try...except

成功把异常所在的行数和具体的错误类型打印了出来。显然,这样写你需要平白无故多写很多代码。

感谢各位的阅读,以上就是“Python中怎么避免滥用try...except”的内容了,经过本文的学习后,相信大家对Python中怎么避免滥用try...except这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI