質問するログイン新規登録

回答編集履歴

2

誤記訂正

2019/10/13 02:41

投稿

nomuken
nomuken

スコア1627

answer CHANGED
@@ -34,7 +34,7 @@
34
34
  出力は
35
35
  ```
36
36
  funcのexcept節に入りました
37
- ret_func(funcの戻り値)を実行しました
37
+ func_in_return(funcの戻り値)を実行しました
38
38
  funcのfinally節に入りました
39
39
  funcの戻り値
40
40
  ```

1

説明追加

2019/10/13 02:40

投稿

nomuken
nomuken

スコア1627

answer CHANGED
@@ -7,4 +7,38 @@
7
7
  > try...finally 文の try スイート内で return 文、 break 文、 continue 文のいずれかが実行されたときは、'抜け出る途中で' finally 節も実行されます。
8
8
 
9
9
 
10
- 参考記事:[finally節の中にreturnを書いてはいけない](https://qiita.com/namn1125/items/ff55d1112039848a8290)
10
+ 参考記事:[finally節の中にreturnを書いてはいけない](https://qiita.com/namn1125/items/ff55d1112039848a8290)
11
+
12
+ ---
13
+ > except節の一部のみを実行してfinally節を実行し、except節の残りを実行するという流れが不自然に見えるのですが、そういうものなのでしょうか...
14
+
15
+ リファレンスにある通り、"抜ける途中"でfinaly節を実行します。
16
+ 例えば以下のようなコードの場合
17
+ ```
18
+ def func_in_return(str):
19
+ print('func_in_return({})を実行しました'.format(str))
20
+ return str;
21
+
22
+
23
+ def func():
24
+ try:
25
+ raise ZeroDivisionError
26
+ except:
27
+ print("funcのexcept節に入りました")
28
+ return func_in_return("funcの戻り値")
29
+ finally:
30
+ print("funcのfinally節に入りました")
31
+
32
+ print(func())
33
+ ```
34
+ 出力は
35
+ ```
36
+ funcのexcept節に入りました
37
+ ret_func(funcの戻り値)を実行しました
38
+ funcのfinally節に入りました
39
+ funcの戻り値
40
+ ```
41
+ になります。
42
+
43
+ このことからreturn文の式が評価されていることがわかります。
44
+ そしてexcept節の途中でreturn文を実行したことで「tryスイートを抜ける」「関数から戻る」の順に処理が実施されます。「tryスイートを抜ける」過程でfinally節が実行されます。