回答編集履歴
1
refinement
answer
CHANGED
@@ -2,8 +2,8 @@
|
|
2
2
|
|
3
3
|
C++に限らず、例外処理(エラーハンドリング)が必要になる状況は2つに分類できます:
|
4
4
|
|
5
|
-
- [A] プログラマのコード実装誤り: ヌルポインタ参照はがし、配列範囲外アクセス、未初期化変数からの読取りなど
|
5
|
+
- [A] プログラマのコード実装誤り: ヌルポインタ参照はがし、配列範囲外アクセス、未初期化変数からの読取りなど。
|
6
|
-
- [B] プログラム実行時の外部環境: ファイル
|
6
|
+
- [B] プログラム実行時の外部環境: ファイル不在、ネットワーク不達、ディスクFULLでファイル書き込めない、メモリ不足など。
|
7
7
|
|
8
8
|
|
9
9
|
---
|
@@ -12,19 +12,19 @@
|
|
12
12
|
|
13
13
|
プログラマの責任範囲において直せるのは、[A] に対する例外処理(エラーハンドリング)のみです。
|
14
14
|
|
15
|
-
むしろプログラミング言語C++に限れば、[A] に対する例外機構はほとんど期待できません。例:ヌルポインタ参照はがしはC++例外機構を用いても検知できません。
|
16
|
-
他のプログラミング言語(例えばJavaやC#)ではヌルポインタ/参照はがしのようなロジックエラーでも、各言語における例外機構によって検知可能です。
|
15
|
+
むしろプログラミング言語C++に限れば、[A] に対する例外機構はほとんど期待できません。例:ヌルポインタ参照はがしはC++例外機構を用いても検知できません。運が良ければ該当箇所でプログラム異常停止、運が悪いとランダムにデータ破損したり一見無関係な箇所でプログラム異常停止します。
|
16
|
+
他のプログラミング言語(例えばJavaやC#)ではヌルポインタ/参照はがしのようなロジックエラーでも、各言語における例外機構によって検知可能です([`NullPointerException`](https://docs.oracle.com/javase/jp/8/docs/api/java/lang/NullPointerException.html)や [`NullReferenceException `](https://docs.microsoft.com/ja-jp/dotnet/api/system.nullreferenceexception))。
|
17
17
|
|
18
18
|
|
19
19
|
> 例外ありきのコードは成立していないと思います。
|
20
20
|
|
21
21
|
実用的なプログラムであれば、[B] に対する例外処理(エラーハンドリング)を行うべきです。
|
22
22
|
|
23
|
-
プログラミング言語Cには例外機構が存在しないため、例外処理(エラーハンドリング)は「特殊な戻り値 や エラー
|
23
|
+
プログラミング言語Cには例外機構が存在しないため、例外処理(エラーハンドリング)は「特殊な戻り値 や エラーコード」を用いて実現されます。
|
24
|
-
例:`fopen`でファイルオープンに失敗すると関数は値`NULL`を返し、エラー原因を表すコードを`
|
24
|
+
例:`fopen`でファイルオープンに失敗すると関数は値`NULL`を返し、エラー原因を表すコードを[`errno`変数](https://cpprefjp.github.io/reference/cerrno/errno.html)に格納する。
|
25
25
|
|
26
|
-
プログラミング言語C++の場合、ほとんどの標準ライブラリ機能は例外機構の存在を前提に設計・提供されます。
|
26
|
+
プログラミング言語C++の場合、ほとんどの標準ライブラリ機能は「例外機構」の存在を前提に設計・提供されます。サードパーティー製ライブラリでも、多くは標準ライブラリに準じた設計が行われます。
|
27
|
-
例:`new MyClass()`でメモリ確保に失敗すると、`std::bad_alloc`例外を送出する。
|
27
|
+
例:`new MyClass()`でメモリ確保に失敗すると、[`std::bad_alloc`例外](https://cpprefjp.github.io/reference/new/bad_alloc.html)を送出する。
|
28
28
|
|
29
29
|
つまり実用的なC++プログラムを作るとなると、例外機構(throw文とtry/catch構文)を用いた例外処理(エラーハンドリング)を避けることはできません。
|
30
30
|
|