回答編集履歴
3
修正
test
CHANGED
@@ -22,11 +22,11 @@
|
|
22
22
|
|
23
23
|
|
24
24
|
|
25
|
-
例えば 3/i という計算を行うとします。通常はこれでいいのですが、i が 0 の場合、答えは未定義になってしまいます。ですから、i が 0 にならないよう、事前にチェックしてはねておかなければいけません。
|
25
|
+
例えば `3 / i` という計算を行うとします。通常はこれでいいのですが、`i` が `0` の場合、答えは未定義になってしまいます。ですから、`i` が `0` にならないよう、事前にチェックしてはねておかなければいけません。
|
26
26
|
|
27
27
|
|
28
28
|
|
29
|
-
ところがプログラマーが i が 0 になる場面を想像していなかったとします。この時、C などの昔の言語であれば、エラーメッセージを出して停止するか、または暴走していました。
|
29
|
+
ところがプログラマーが `i` が `0` になる場面を想像していなかったとします。この時、C などの昔の言語であれば、エラーメッセージを出して停止するか、または暴走していました。
|
30
30
|
|
31
31
|
|
32
32
|
|
@@ -38,7 +38,7 @@
|
|
38
38
|
|
39
39
|
|
40
40
|
|
41
|
-
不正な処理が行われると、例外が発生します。例外のデフォルトの動作は、メッセージを出し、以降の関連する処理を必要なところまでスキップ
|
41
|
+
不正な処理が行われると、例外が発生します。例外のデフォルトの動作は、メッセージを出し、以降の関連する処理を必要なところまでスキップすることです。
|
42
42
|
|
43
43
|
|
44
44
|
|
@@ -68,8 +68,8 @@
|
|
68
68
|
|
69
69
|
コンテキストマネージャーとは、例外が起こった時の処理方法を知っているオブジェクトのことです。
|
70
70
|
|
71
|
-
具体的には、__enter__ と__exit__ を実装したオブジェクトのことです。
|
71
|
+
具体的には、`__enter__` と `__exit__` を実装したオブジェクトのことです。
|
72
72
|
|
73
73
|
|
74
74
|
|
75
|
-
__enter__ は with 文に入る時に呼ばれ、初期化を担当します。__exit__ は出るときに呼ばれます。出る時というのは例外が起こった時も含みます。したがって __exit__ に書くべきは finally ブロックに書いていた処理です。
|
75
|
+
`__enter__` は `with` 文に入る時に呼ばれ、初期化を担当します。`__exit__` は出るときに呼ばれます。出る時というのは例外が起こった時も含みます。したがって `__exit__` に書くべきは `finally` ブロックに書いていた処理です。
|
2
追記
test
CHANGED
@@ -7,3 +7,69 @@
|
|
7
7
|
`close()` を省略する楽な書き方ではありません。例外が起こっても必ず `close()` のような最終処理が呼ばれるようにするための仕組みです。
|
8
8
|
|
9
9
|
ファイルのオープン・クローズだけでなく、コンテキストマネージャは様々な場面で使います。
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
追記
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
どこからどこまで解説すればいいのかわかりませんが、解決してないようなのでやってみましょうか。
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
まずは「例外」というものがあるのをご存知ですか?
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
例えば 3/i という計算を行うとします。通常はこれでいいのですが、i が 0 の場合、答えは未定義になってしまいます。ですから、i が 0 にならないよう、事前にチェックしてはねておかなければいけません。
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
ところがプログラマーが i が 0 になる場面を想像していなかったとします。この時、C などの昔の言語であれば、エラーメッセージを出して停止するか、または暴走していました。
|
30
|
+
|
31
|
+
|
32
|
+
|
33
|
+
このため、例外的なデータをチェックするコードが何重にも書かれることになり、主なアルゴリズムがそれに隠れて読みにくくなっていました。
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
これを改善するために生まれたのが例外と例外処理です。
|
38
|
+
|
39
|
+
|
40
|
+
|
41
|
+
不正な処理が行われると、例外が発生します。例外のデフォルトの動作は、メッセージを出し、以降の関連する処理を必要なところまでスキップします。
|
42
|
+
|
43
|
+
|
44
|
+
|
45
|
+
例外が起きそうなところを try catch ブロックで囲むと、このデフォルトの動作を上書きできます。
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
これによって事前に何重ものチェックをしなくても、実際に不正なデータが入力された段階で一度のチェックで済ませることができるようになり、コードの可読性が向上します。
|
50
|
+
|
51
|
+
|
52
|
+
|
53
|
+
また、finally を使えば、スキップしてはいけない部分を明示的に指示できます。これにより、例えばオープンしたファイルが必ずクローズされるよう保証できます。
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
この try catch finally ブロックはプログラマーが書く必要がありますが、多くの場合、同じ処理を書くことになります。例えば、ファイルを開いた時には必ず finally で閉じます。
|
58
|
+
|
59
|
+
|
60
|
+
|
61
|
+
このようにオブジェクトによって例外処理が決まっているなら、オブジェクト自身が処理方法を知っていればいいじゃないかという考えが出てきます。そうすれば何度も何度も同じことを書かずに済みます。
|
62
|
+
|
63
|
+
|
64
|
+
|
65
|
+
一連の文から成る一定の処理を文脈(コンテキスト)と言いますが、この例外処理を行う文脈(コンテキスト)を管理(マネージメント)するのがコンテキストマネージャーです。
|
66
|
+
|
67
|
+
|
68
|
+
|
69
|
+
コンテキストマネージャーとは、例外が起こった時の処理方法を知っているオブジェクトのことです。
|
70
|
+
|
71
|
+
具体的には、__enter__ と__exit__ を実装したオブジェクトのことです。
|
72
|
+
|
73
|
+
|
74
|
+
|
75
|
+
__enter__ は with 文に入る時に呼ばれ、初期化を担当します。__exit__ は出るときに呼ばれます。出る時というのは例外が起こった時も含みます。したがって __exit__ に書くべきは finally ブロックに書いていた処理です。
|
1
修正
test
CHANGED
@@ -6,4 +6,4 @@
|
|
6
6
|
|
7
7
|
`close()` を省略する楽な書き方ではありません。例外が起こっても必ず `close()` のような最終処理が呼ばれるようにするための仕組みです。
|
8
8
|
|
9
|
-
ファイルのオープン・クローズだけでなく、コンテキストマネージャ
|
9
|
+
ファイルのオープン・クローズだけでなく、コンテキストマネージャは様々な場面で使います。
|