惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Engineering at Meta
Engineering at Meta
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
小众软件
小众软件
博客园_首页
T
Tailwind CSS Blog
美团技术团队
博客园 - 叶小钗
Microsoft Security Blog
Microsoft Security Blog
有赞技术团队
有赞技术团队
Apple Machine Learning Research
Apple Machine Learning Research
大猫的无限游戏
大猫的无限游戏
Microsoft Azure Blog
Microsoft Azure Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
I
InfoQ
MongoDB | Blog
MongoDB | Blog
The Cloudflare Blog
J
Java Code Geeks
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东
酷 壳 – CoolShell
酷 壳 – CoolShell
Blog — PlanetScale
Blog — PlanetScale
IT之家
IT之家
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Y
Y Combinator Blog

膨胀自留地

使用CloudFlare标记管理功能优雅的使用谷歌分析 四天轻松版北京旅游攻略 Adsense税务居住地证明申请教程:如何申请中国税收居民身份证明以及Google Adsense更新新加坡税务信息教程 常见的 VPS 优化措施 HTML实现table表格移动端自动转为卡片样式 个人网站接入 Google 登录 如何从 GitHub 永久删除泄露的 .env 文件 Cloudflare设置www的域名跳转到不带www的域名 顶级iOS神器!全面解开App Store限制,AssPP Pro保姆级教程 BroadcastChannel将你的 Telegram Channel 转为微博客 Medama开源轻量级网站统计(分析)系统 白嫖一个网站监控面板:uptime-kuma 部署TraffMonetizer利用闲置VPS挂机赚钱 Counterscale-使用CloudflareWorkers部署的免费网站数据统计工具,界面类似umami 封装一个最简单的Axios,避免过度封装! 如何使用Cloudflare Email Routing创建域名邮箱免费发送邮件 使用Cron定时更新Hosts解决Gihub无法访问问题 容器化MariaDB/Mysql实现定时备份 JetBrains全家桶许可证服务器怎么找,JetBrains激活教程 图片加速接口:缓存图片,加速访问,解决防盗链 MySQL模糊查询再也不用like+%了,全文索引介绍及使用简介 为什么这么多人推荐你办理流量卡?流量卡怎么赚钱?怎么避坑? 借助Cloudflare Worker实现Google Analytics反代加速,规避广告屏蔽插件的拦截 etcd入门之在Centos上安装部署 Grafana在linux下安装和基本使用入门 Prometheus介绍、安装和基本功能快速入门 无需加速器,油猴插件解锁xbox云游戏 阿里云盘自动每日签到,无需部署,无需服务器 自定义VSCode终端主题样式 一行 CSS 代码实现响应式布局 – 使用 Grid 实现的响应式布局
脱离苦海,从避免滥用try...except...开始
2020-05-07 · via 膨胀自留地

#编程技术 2020-05-07 18:22:25 | 全文 1263 字,阅读约需 3 分钟 | 加载中... 次浏览

👋 相关阅读


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

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


try:
    func()
except Exception as e:
    print('函数错误:', e)

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

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

Alt text

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

如果你饱受滥用 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 必须是整型'
    ...

如下图所示: Alt text

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

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

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

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

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

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

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

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

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

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

强行打印报错信息

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

它的用法非常简单:

import traceback

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

运行效果如下图所示: Alt text

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

总结

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

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

via:https://mp.weixin.qq.com/s/HSlhecinUym70xsFhaFpjA


×