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
hjq98765
V2EX  ›  Python

小白求解惑: try/except/else/finally 语句中, else 的块为什么不能直接放到 try 下面?

  •  
  •   hjq98765 · 2017-07-31 19:29:35 +08:00 · 3019 次点击
    这是一个创建于 2450 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如果把 else 块的代码放到 try 里面,那么:
    前面原 try 部分的代码报错的话,自然也不会执行后面原 else 部分代码的语句了;
    前面原 try 部分的代码没报错的话,后面原 else 部分代码的语句就会继续执行了

    所以 else 的意义何在?
    6 条回复    2017-08-01 10:28:58 +08:00
    misaka19000
        1
    misaka19000  
       2017-07-31 20:21:17 +08:00 via Android
    看了半天没看懂什么意思,楼下解释是一下
    blahgeek
        2
    blahgeek  
       2017-07-31 20:26:09 +08:00 via iPhone   ❤️ 1
    hustlibraco
        3
    hustlibraco  
       2017-07-31 21:13:31 +08:00
    你把语句块全部放到 try 里面也没关系,但是有可能 else 从句中的代码也会产生异常,从而执行了你语气之外的 except 语句。
    hjq98765
        4
    hjq98765  
    OP
       2017-07-31 21:18:09 +08:00
    @blahgeek 原来 else 里面是放一些不被 try-catch 保护的代码,学习到了,谢谢!
    billion
        5
    billion  
       2017-07-31 22:03:09 +08:00
    else 从来不会单独使用。else 只能配套使用构成下面的结构:
    while .. .else
    for ... else
    try ... else
    if ... else

    既然是配套使用,那么前面后面的缩进就要一样。
    如果你把 else 单独放在 try 的里面,那它和 try 的缩进层级就不一样了,所以自然就会报错。
    hjq98765
        6
    hjq98765  
    OP
       2017-08-01 10:28:58 +08:00
    @billion 不是这个意思,我的意思是:

    原代码是这样子:

    ```
    try:
    do sth.1
    except:
    do sth.2
    else:
    do sth.3
    finally:
    do sth.4
    ```


    我要把代码变成:
    ```
    try:
    do sth.1
    do sth.3
    except:
    do sth.2
    finally:
    do sth.4
    ```

    我的问题是:这两者有什么区别?毕竟 do sth.1 和 do sth.3 要么都执行完毕、要么都不执行完毕

    收到的回答是:原代码只保护 do sth.1,而不保护 do sth.3,如果 do sth.3 报错则直接抛出错误
    修改后的代码则 do sth.1 和 do sth.3 都保护了,如果 do sth.3 报错则会执行 do sth.2
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4144 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 05:16 · PVG 13:16 · LAX 22:16 · JFK 01:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.