回答編集履歴

2

誤記訂正

2019/10/13 02:41

投稿

nomuken
nomuken

スコア1627

test CHANGED
@@ -70,7 +70,7 @@
70
70
 
71
71
  funcのexcept節に入りました
72
72
 
73
- ret_func(funcの戻り値)を実行しました
73
+ func_in_return(funcの戻り値)を実行しました
74
74
 
75
75
  funcのfinally節に入りました
76
76
 

1

説明追加

2019/10/13 02:40

投稿

nomuken
nomuken

スコア1627

test CHANGED
@@ -17,3 +17,71 @@
17
17
 
18
18
 
19
19
  参考記事:[finally節の中にreturnを書いてはいけない](https://qiita.com/namn1125/items/ff55d1112039848a8290)
20
+
21
+
22
+
23
+ ---
24
+
25
+ > except節の一部のみを実行してfinally節を実行し、except節の残りを実行するという流れが不自然に見えるのですが、そういうものなのでしょうか...
26
+
27
+
28
+
29
+ リファレンスにある通り、"抜ける途中"でfinaly節を実行します。
30
+
31
+ 例えば以下のようなコードの場合
32
+
33
+ ```
34
+
35
+ def func_in_return(str):
36
+
37
+ print('func_in_return({})を実行しました'.format(str))
38
+
39
+ return str;
40
+
41
+
42
+
43
+
44
+
45
+ def func():
46
+
47
+ try:
48
+
49
+ raise ZeroDivisionError
50
+
51
+ except:
52
+
53
+ print("funcのexcept節に入りました")
54
+
55
+ return func_in_return("funcの戻り値")
56
+
57
+ finally:
58
+
59
+ print("funcのfinally節に入りました")
60
+
61
+
62
+
63
+ print(func())
64
+
65
+ ```
66
+
67
+ 出力は
68
+
69
+ ```
70
+
71
+ funcのexcept節に入りました
72
+
73
+ ret_func(funcの戻り値)を実行しました
74
+
75
+ funcのfinally節に入りました
76
+
77
+ funcの戻り値
78
+
79
+ ```
80
+
81
+ になります。
82
+
83
+
84
+
85
+ このことからreturn文の式が評価されていることがわかります。
86
+
87
+ そしてexcept節の途中でreturn文を実行したことで「tryスイートを抜ける」「関数から戻る」の順に処理が実施されます。「tryスイートを抜ける」過程でfinally節が実行されます。