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

2017-07-31 19:29:35 +08:00
 hjq98765
如果把 else 块的代码放到 try 里面,那么:
前面原 try 部分的代码报错的话,自然也不会执行后面原 else 部分代码的语句了;
前面原 try 部分的代码没报错的话,后面原 else 部分代码的语句就会继续执行了

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

既然是配套使用,那么前面后面的缩进就要一样。
如果你把 else 单独放在 try 的里面,那它和 try 的缩进层级就不一样了,所以自然就会报错。
hjq98765
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

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

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

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

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

© 2021 V2EX