V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
whx20202
V2EX  ›  Python

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

  •  
  •   whx20202 · 2017-01-19 13:22:07 +08:00 · 6204 次点击
    这是一个创建于 2872 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    第 1 条附言  ·  2017-01-19 14:00:42 +08:00
    感谢各位,明白了
    21 条回复    2017-01-20 10:18:20 +08:00
    Monstercat
        1
    Monstercat  
       2017-01-19 13:30:44 +08:00
    当然是里面了 try 的意义不就是这样吗
    clino
        2
    clino  
       2017-01-19 13:35:49 +08:00
    如果后续需要依赖会出错的函数,那应该在里面
    如果后续不依赖,出错了也要执行就放外面
    mgna17
        3
    mgna17  
       2017-01-19 13:41:09 +08:00
    python 的话,我喜欢放 else 里面
    coolair
        4
    coolair  
       2017-01-19 13:44:31 +08:00 via Android
    红帽有偏文章,说是像 if xxx==True 这样的语句可以用 try catch 来写尽量用 try catch ,说是更 pythonic
    pppy
        5
    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
        6
    QAPTEAWH  
       2017-01-19 14:00:20 +08:00
    throw/catch (except/catch) 更能表达这个操作的本质, try 只是个定界符。
    DingSoung
        7
    DingSoung  
       2017-01-19 14:13:51 +08:00
    try 不冷处理所有的异常,不代表 try 了这一块就不会崩溃。
    都知道容易出错了,就把容易出错的说一下处理,类型检查,越界,线程安全等等
    DingSoung
        8
    DingSoung  
       2017-01-19 14:14:34 +08:00
    看错了 我说的是 Objc
    maomaomao001
        10
    maomaomao001  
       2017-01-19 14:48:23 +08:00 via Android
    JavaScript 里, tryc 似乎比 if 快很多
    knightdf
        11
    knightdf  
       2017-01-19 14:52:11 +08:00
    这个。。。刚需而且没有对比,低不低没有意义
    xjp
        12
    xjp  
       2017-01-19 15:07:44 +08:00 via iPhone
    js 里尽量少用 try catch 因为 v8 引擎不会对 trycatch 进行优化
    otakustay
        13
    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
        14
    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
        15
    gamexg  
       2017-01-19 16:22:21 +08:00 via Android
    @glasslion +1 不喜欢太长。
    前面的异常捕获后直接 return 或继续抛异常。
    ipwx
        16
    ipwx  
       2017-01-19 16:36:51 +08:00
    try: ... catch ... else: ...
    ryd994
        17
    ryd994  
       2017-01-19 22:12:47 +08:00 via Android
    @est 你这样欺负解释器语言………
    谁知道解释器自己用掉多少嘛………
    Allianzcortex
        18
    Allianzcortex  
       2017-01-19 22:53:56 +08:00 via iPhone
    .... . easier ask forgiveness than get permission ,所以写就好了
    eyp82
        19
    eyp82  
       2017-01-20 09:01:11 +08:00
    Python 的 try..catch 有个蛋疼的问题是, 搞一下这个, 就要往右缩进 4 个字符, 有时逻辑复杂已经缩进了好多实在是不想因为这个再缩进了.
    另外 try catch 包围起来的代码块里代码尽可能少, 尽量只放你要保护的代码, 其他的无关代码全拿到外面.
    wizardoz
        20
    wizardoz  
       2017-01-20 09:26:33 +08:00
    @eyp82 你说的这个是 try catch 的锅吗? python 中 if else 也有这个头疼的问题
    eyp82
        21
    eyp82  
       2017-01-20 10:18:20 +08:00
    @wizardoz 你说是缩进吗? 这也不是锅啦. 我有强迫症, 看着代码格式不好看就想给它弄漂亮一点.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2556 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 05:06 · PVG 13:06 · LAX 21:06 · JFK 00:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.