话说 try catch 执行效率低吗?不限于 Python

2017-01-19 13:22:07 +08:00
 whx20202

突然有个想法,如果有下面代码:

try:
    容易出错的函数()
    后续()                 #这个函数必须等前面函数,不出错才能执行
catch Exception e:
    pass

你们会把后续函数放在哪里? try-catch 里面还是外面?

6218 次点击
所在节点    Python
21 条回复
Monstercat
2017-01-19 13:30:44 +08:00
当然是里面了 try 的意义不就是这样吗
clino
2017-01-19 13:35:49 +08:00
如果后续需要依赖会出错的函数,那应该在里面
如果后续不依赖,出错了也要执行就放外面
mgna17
2017-01-19 13:41:09 +08:00
python 的话,我喜欢放 else 里面
coolair
2017-01-19 13:44:31 +08:00
红帽有偏文章,说是像 if xxx==True 这样的语句可以用 try catch 来写尽量用 try catch ,说是更 pythonic
pppy
2017-01-19 13:56:22 +08:00
尽量用 try except 。(针对 Python
●Throwing exceptions is not “ expensive ” in Python unlike e.g. Java.
● Rely on duck typing rather than checking for a specific type.
QAPTEAWH
2017-01-19 14:00:20 +08:00
throw/catch (except/catch) 更能表达这个操作的本质, try 只是个定界符。
DingSoung
2017-01-19 14:13:51 +08:00
try 不冷处理所有的异常,不代表 try 了这一块就不会崩溃。
都知道容易出错了,就把容易出错的说一下处理,类型检查,越界,线程安全等等
DingSoung
2017-01-19 14:14:34 +08:00
看错了 我说的是 Objc
est
2017-01-19 14:17:43 +08:00
maomaomao001
2017-01-19 14:48:23 +08:00
JavaScript 里, tryc 似乎比 if 快很多
knightdf
2017-01-19 14:52:11 +08:00
这个。。。刚需而且没有对比,低不低没有意义
xjp
2017-01-19 15:07:44 +08:00
js 里尽量少用 try catch 因为 v8 引擎不会对 trycatch 进行优化
otakustay
2017-01-19 15:24:12 +08:00
1. 大部分情况下,不 throw 的 try 块基本不会有什么损失
2. 如 @xjp 所说 V8 有这问题,这属于 V8 太烂- -
3. try/catch 是业务控制,大部分时候容不得你用还是不用,我不建议为了所谓性能去把应该用异常的场合变成 return code 之类的方式
4. 但这并不代表鼓励你大块大块使用 try/catch ,需要的场合应该都只是一小块的关键代码
5. 对于 V8 这种场景,如果想减小 try/catch 对优化的影响,把 try/catch 放进一个独立函数中即可
glasslion
2017-01-19 15:58:10 +08:00
1. Python 的 try catch 性能损失很小
2. Python 社区一般会推荐使用 try-catch 风格的异常检查, 因为
2.1 try-catch 的代码往往比 检查 return code 更精简
2.2 检查 return code 可能会造成 race condition.
3. 你样例里的 后续() 不应该放在 try-catch 里。 一般 try-catch 里的代码应该尽量少, 但这和性能无关。
因为你的本意是捕捉 容易出错的函数() 里的异常, 而这段代码实际上做的是 捕捉 容易出错的函数() 和 后续() 的异常, 而后续() 往往不能直接套用前面的异常处理逻辑
gamexg
2017-01-19 16:22:21 +08:00
@glasslion +1 不喜欢太长。
前面的异常捕获后直接 return 或继续抛异常。
ipwx
2017-01-19 16:36:51 +08:00
try: ... catch ... else: ...
ryd994
2017-01-19 22:12:47 +08:00
@est 你这样欺负解释器语言………
谁知道解释器自己用掉多少嘛………
Allianzcortex
2017-01-19 22:53:56 +08:00
.... . easier ask forgiveness than get permission ,所以写就好了
eyp82
2017-01-20 09:01:11 +08:00
Python 的 try..catch 有个蛋疼的问题是, 搞一下这个, 就要往右缩进 4 个字符, 有时逻辑复杂已经缩进了好多实在是不想因为这个再缩进了.
另外 try catch 包围起来的代码块里代码尽可能少, 尽量只放你要保护的代码, 其他的无关代码全拿到外面.
wizardoz
2017-01-20 09:26:33 +08:00
@eyp82 你说的这个是 try catch 的锅吗? python 中 if else 也有这个头疼的问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/335590

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX