脱离苦海,从避免滥用try...except...开始

简介: 脱离苦海,从避免滥用try...except...开始

摄影:产品经理上海滩大佬宅子里面的大餐

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

def func():
    try:
        "函数内部代码"
    except Exception as e:
        print('函数错误:', e)
try:
    func()
except Exception as e:
    print('函数错误:', e)

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

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

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

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

把问题暴露出来

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

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

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

def query_name(user_id):
    if not isinstance(user_id, int):
        return {'success': False, 'msg': '用户 id 必须是整型'}
    ...

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

def query_name(user_id):
    if not isinstance(user_id, int):
        raise Exception('用户 id 必须是整型'}
    ...

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

def query_name(user_id):
    assert isinstance(user_id, int), '用户 id 必须是整型'
    ...

如下图所示:

只要 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模块。

它的用法非常简单:

import traceback
try:
    1 + 'a'
except Exception:
    print(traceback.format_exc())

运行效果如下图所示:

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

总结

try...except...会让你的代码看起来没有问题,但也有可能会掩盖问题,让你无法发现哪里有问题。所以,从看了这篇文章开始,删除不必要的try...except...

拥抱异常,让你无法处理的异常抛出来。程序出现了问题应该停止运行,而不是带着问题继续运行,这样可能会演变成更大的问题。

目录
相关文章
|
4月前
|
监控 安全 物联网
物联卡安全问题
物联卡安全性涵盖技术、管理和使用安全。技术上,通过专用通道和加密技术保障数据传输安全;管理上,实施实名认证与风险防控措施;使用中需合规操作、警惕诈骗并定期检查更新。尽管如此,仍需防范管理漏洞、诈骗及非法流量风险,确保安全运行。
|
6月前
|
监控 安全 区块链
智能合约中权限管理不当
智能合约中权限管理不当
60 7
|
7月前
|
人工智能 安全 数据管理
要解决数据泄露和滥用问题
【4月更文挑战第19天】要解决数据泄露和滥用问题
64 1
|
7月前
|
机器学习/深度学习 自然语言处理 安全
数据安全目前面临的最大挑战是数据泄露和数据滥用的问题
【4月更文挑战第19天】数据安全目前面临的最大挑战是数据泄露和数据滥用的问题
179 1
|
7月前
|
UED
AIGC滥用的三大后果
AIGC滥用的三大后果
174 8
AIGC滥用的三大后果
你担心大家会滥用的全局变量,大家(包括你自己)一定会滥用
你担心大家会滥用的全局变量,大家(包括你自己)一定会滥用
|
机器学习/深度学习 人工智能 安全
网络安全威胁的识别和防范策略
网络安全威胁的识别和防范是当今数字化时代不可忽视的问题。恶意软件、网络钓鱼等威胁不断演变,需要持续关注和采取措施来保护个人隐私和企业数据。通过有效的识别方法和防范策略,我们可以更好地应对不断变化的网络安全挑战。
488 1
|
存储 安全 网络安全
利用隐私法规的漏洞窃取用户身份
欧盟的通用数据保护条例 (GDPR) 已成为现代隐私法律的试金石,部分原因是它赋予消费者前所未有的对其个人信息使用的控制权。然而,同样的权力可能容易被恶意攻击者滥用。在本文中考虑了社会工程师如何滥用围绕“访问权”(Right of Access)过程的法律歧义。这一假设通过对 150 多家企业的对抗性案例研究进行了验证。发现许多组织未能采取足够的保护措施来防止滥用访问权,从而有可能将敏感信息暴露给未经授权的第三方。这些信息的敏感性各不相同,从简单的公共记录到社会安全号码和帐户密码。这些发现表明,迫切需要改进主体访问请求流程的实施。为此本文提出可能的补救措施,以供政府、行业和个人进一步考虑。
89 2
|
存储 机器学习/深度学习 监控
导致数据泄露的六个疏忽
导致数据泄露的六个疏忽