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

回答編集履歴

1

refinement

2020/07/30 06:09

投稿

yohhoy
yohhoy

スコア6191

answer CHANGED
@@ -2,8 +2,8 @@
2
2
 
3
3
  C++に限らず、例外処理(エラーハンドリング)が必要になる状況は2つに分類できます:
4
4
 
5
- - [A] プログラマのコード実装誤り: ヌルポインタ参照はがし、配列範囲外アクセス、未初期化変数からの読取りなど
5
+ - [A] プログラマのコード実装誤り: ヌルポインタ参照はがし、配列範囲外アクセス、未初期化変数からの読取りなど
6
- - [B] プログラム実行時の外部環境: ファイルが存しない、ネットワーク不達、ディスクFULLでファイル書き込めない、メモリ不足など
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`を返し、エラー原因を表すコードを`error`に格納する。
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