れいがい‐しょり〔レイグワイ‐〕【例外処理】
例外処理
例外処理
別名:エラーハンドリング
【英】exception handling
例外処理とは、プログラムの処理中に想定外のエラーが発生した際に実行される、そのエラーへの対処となる処理のことである。
例外処理は、多くの場合、プログラムのデータの損失や、想定されていない処理が入力されたことなどを原因として発生する。例えば、数字が入力されることを想定して作成されたプログラムに、ひらがなが入力されると、プログラムはそれ以上処理を続行できず、エラーとなる。そのようなときに例外処理が実行される。
例外処理の処理内容は、プログラム内にあらかじめ用意しておく必要がある。例外処理が準備されていない場合、エラーが発生した際にどういった反応が起こるか予測できない。無限に入出力を繰り返したり、入力不可能になったりする場合もある。
C++やJavaといったプログラミング言語は、プログラミング言語そのものが例外処理を想定して作られており、例外処理の作成が比較的容易であるとされる。
例外処理
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2023/08/17 05:32 UTC 版)
例外処理(れいがいしょり、英語: exception handling)とは、IT業界で用いられる専門用語で、ある抽象レベルにおけるシステムの設計で想定されておらず、ユーザー操作によって解決できない問題に対処するための処理である。例外処理の結果として問題が解決されないとシステム障害になる。システム停止やデータ破損の原因になり、ユーザーに損害を与える可能性があるため、システム開発で例外処理は重要視されている[1][2][3]。
- ^ a b “第 5 章 例外処理 (C++ プログラミングガイド)”. docs.oracle.com. 2019年10月26日閲覧。
- ^ a b “IPA ISEC セキュア・プログラミング講座:C/C++言語編 第6章 フェイルセーフ:体系だてたエラーハンドリング”. www.ipa.go.jp. 2019年10月26日閲覧。
- ^ a b “エラー処理をパターンにはめよう”. Codezine. 2019年10月26日閲覧。
- ^ Bjarne Stroustrup. “Appendix E: Standard-Library Exception Safety in "The C++ Programming Language" (3rd Edition).Addison-Wesley, ISBN 0-201-88954-4”. 2013年5月1日閲覧。
- ^ “Exception-Safety in Generic Components”. 2013年5月1日閲覧。
- ^ http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1997/N1077.asc
- ^ /EH (例外処理モデル)
- ^ ただし、例外処理中にもう一度別のデストラクタから例外が発生してしまうと復帰できなくなるため、デストラクタから例外を発生させるべきではないとされる。
- ^ 例外指定は、 C++関数によって伝達される例外の種類についてプログラマが意図したものを示す言語機能です。 Microsoft Docs Visual C++
- ^ C++17ではこの動的例外仕様が削除される。C++日本語リファレンス
- ^ class StopIteration Ruby 1.9.3 リファレンスマニュアル(2013年10月7日閲覧)。
- ^ 組み込み例外 Python 2.7ドキュメンテーション(2013年10月7日閲覧)。
- ^ module function Kernel.#throw Ruby 1.9.2 リファレンスマニュアル(2013年10月7日閲覧)。
- ^ たとえばCOMではメソッドの戻り値として、MAKE_HRESULT()マクロを用いてHRESULTコードを定義するが、異常系は負数となる。
- ^ CUDAのように列挙型で定義した正の数をエラーコードとして使用するライブラリもある。CUDA Runtime API :: CUDA Toolkit Documentation
- ^ GetFileSize 関数
- ^ GetFileSize function (Windows)
- ^ “C言語規格のドラフト”. 2018年11月21日閲覧。
例外処理
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/08/17 21:54 UTC 版)
「C SharpとJavaの比較」の記事における「例外処理」の解説
Javaは非チェック例外 (unchecked exception) に加えてチェック済み例外 (checked exception) をサポートする。C#では非チェック例外のみである。チェック済み例外は、プログラマがメソッドから発生し得るものを全て宣言し、捕捉する必要がある。 全てのエラーが処理されることを保証できるため、チェック済み例外は非常に便利だとする者もいる。一方、C#の設計者であるアンダース・ヘルスバーグのように、Javaのチェック済み例外はある程度実験的な仕様であり、小さなプログラムでの例を除いては実装する価値を見出せなかった、とする者もいる。一つの批判として、チェック済み例外はプログラマが空のcatchブロックを記述するのを促進し、catch (Exception e) {}のような危険なコードを増やす結果になってしまったというものがある。また別の批判として、メソッドの実装に変更を加えた結果新しいチェック済み例外が発生するようになる可能性があり、これによって契約が破壊されてしまう、というものがある。これは限られた例外のみが宣言されたインタフェースを実装するメソッドや、メソッドの内部実装が変更された場合に起こり得る。中には、このような予期しない例外が発生することを見越し、あらゆる型の例外が発生し得る、と宣言 (throws Exception) するプログラマもいる。これはチェック済み例外の利点を無にしている。しかしながら、いくつかの場面では例外連鎖 (exception chaining)、すなわち捕捉した例外を別の例外でラップして投げ直す、という手法が適用できる。例えば、ファイルにアクセスするコードがデータベースにアクセスするよう変更された場合、呼び出し側は内部で何が行われているかを知る必要がないため、SQLExceptionが捕捉された場合でもIOExceptionとして投げ直すことが可能である。 try-finallyステートメントにおいても両者は異なる。finallyは例えtryブロック内でthrowやreturnが実行された場合でも必ず実行される。これは、try内とfinally内で異なる値がreturnされた場合に予期しない振る舞いを生じることがある。C#ではfinallyブロック内ではreturnやbreakといった文の実行を禁止している。
※この「例外処理」の解説は、「C SharpとJavaの比較」の解説の一部です。
「例外処理」を含む「C SharpとJavaの比較」の記事については、「C SharpとJavaの比較」の概要を参照ください。
例外処理
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/05/10 00:54 UTC 版)
「Go (プログラミング言語)」の記事における「例外処理」の解説
他の言語で使われている方式の例外処理機能はない。Goにも例外があり、リカバーと合わせてtry-catchのような事もできるが推奨されない。例外機能は、主に0除算など起きてはならないことに使われ普通は強制終了するが、リカバーによって強制終了しないようにする事も可能である。Goでは、事前に例外が起きないよう確認する事や、成功かどうかのBool値を返す事のような、例外を起こさない方法が好まれる。
※この「例外処理」の解説は、「Go (プログラミング言語)」の解説の一部です。
「例外処理」を含む「Go (プログラミング言語)」の記事については、「Go (プログラミング言語)」の概要を参照ください。
例外処理
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/11/24 15:35 UTC 版)
「Javaに対する批判」の記事における「例外処理」の解説
JavaではC++でオプションとされていた例外処理の仕様を取り込んだが、この際チェック対象の例外に対応するthrows文を必須とした。例外のチェックは小規模なシステムにとっては役立つが、大規模なシステムについても有益であるかどうかについては統一的な見解には至っていない。特に上位のコードでは下位のコードから発生するエラーを意識したくない(例としては、名前解決例外であるNamingException)。名前クラスの作成者は名前解決例外をチェック対象の例外として上位コードに対応を強制するか、コンパイル時のチェックを使わずに下位のコードからの例外を連鎖的に通知するかを選択する必要がある。
※この「例外処理」の解説は、「Javaに対する批判」の解説の一部です。
「例外処理」を含む「Javaに対する批判」の記事については、「Javaに対する批判」の概要を参照ください。
例外処理
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/06/11 02:27 UTC 版)
例外はなにか不具合が起こったときraiseの呼び出しで発生させることができる。Ruby での例外は Exception クラスか、そのサブクラスのインスタンスである。 例外にはメッセージを追加することもできる raise "This is a message" さらに例外のタイプも指定できる raise ArgumentError, "Illegal arguments!" 例外はrescue節で処理することができ、次のようにコードにrescueを付加するだけである begin # 通常処理rescue # 例外処理。引数を省略すると、StandardErrorのサブクラスの例外のみ処理するrescue SomeError # 例外処理。SomeErrorの例外のみ処理する。ensure # 例外の発生に関わらず必ず実行される処理else # 例外が発生しなかったときに実行される処理end
※この「例外処理」の解説は、「Ruby」の解説の一部です。
「例外処理」を含む「Ruby」の記事については、「Ruby」の概要を参照ください。
例外処理
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/12/04 08:56 UTC 版)
IEEE 754-2008では5種類の例外が定義されている。それぞれ、(確定的なアンダーフローを除いて)対応する状態フラグが存在し、例外発生時には対応するフラグが設定される。それ以外の動作は定義されていないが、デフォルト(下記)以外の追加の対処が推奨されている(後述)。 5種類の内訳は以下のとおりである。 無効な演算(負数に対して平方根を求めようとしたなど) - デフォルトではqNaNを返す。 0除算(1/0 や log(0) など) - デフォルトでは ±∞ を返す。 オーバーフロー(結果が正しく表現できないほど大きくなった場合) - 最近接丸めモードの場合、デフォルトでは ±∞ を返す。 アンダーフロー(結果が正規数で表現できないほどに小さく非0であるが不正確な結果となった場合) - デフォルトでは非正規化数を返す。 不正確 - デフォルトでは指定されたモードの丸めを施した結果を返す。 これらは、IEEE 754-1985と同一である。ただし、IEEE 754-1985 ではゼロ除算例外は除算のみだったが、IEEE 754-2008 ではそれ以外の演算でも発生する。
※この「例外処理」の解説は、「IEEE 754」の解説の一部です。
「例外処理」を含む「IEEE 754」の記事については、「IEEE 754」の概要を参照ください。
例外処理
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/07/14 08:30 UTC 版)
「キーワード (Java)」の記事における「例外処理」の解説
例外処理はC言語にはない。Javaでは、C++およびC#とほぼ共通の構文およびキーワードが使用されている。ただしfinallyはC++には存在せず、throwsはC#には存在しない。 try, catch, finally例外が発生しうる箇所で使用する。tryブロック (try{と}との間) で例外が発生しうるコードを囲み、catchブロック (catch(Throwableの派生クラス例外オブジェクト){と}との間) に例外発生後の処理を書く。finallyブロック (finally{と}との間) には、ファイルのクローズ、データベースセッションの切断、ログアウトなど、例外発生の有無にかかわらずtry/catchブロック内の処理を終了する前に必ず実行しておきたいコードを書く。catchを記述した場合finallyは省略可能であり、finallyを記述した場合catchは省略可能である。try/catchブロックとfinallyブロックの両方にreturn文がある場合、後者が優先される。catchブロックにはif-else-if文のように連続して捕捉したい例外を記述することができる。 throw例外を発生させる。 throwsメソッドの宣言で使用される。そのメソッドがどのような例外をスローするかを列挙する。Javaにおける例外の種類には大きく分けて throws の明示が必要な例外と必要でない例外がある。前者は主にファイルエラーなどプログラムの動作中にその都度対応すべき例外で、後者は主に開発・デバッグの段階で対処すべき例外あるいは深刻なエラーである。 以下はIOExceptionを使った記述例である。 public void method() throws Exception { // メソッドが例外をスローすることを宣言 try { ... if (エラー条件) throw new IOException(); // 例外を発生させる。 // (1) 正常終了 // このtryブロックにはreturn文を記述することもできる。 // ただし、finallyブロックにすでにreturn文があるときは、ここにreturn文を書いてもfinallyブロックのreturnが優先される。 } catch (IOException e) { // IOException は Java の例外クラスの1つ // (2) 例外処理 // このcatchブロックにはreturn文を記述することもできる。 // ただし、finallyブロックにすでにreturn文があるときは、ここにreturn文を書いてもfinallyブロックのreturnが優先される。 } catch (Exception e) { // IOException よりも上位(親)の例外クラス // (3) 例外をさらに外のブロックにスローする。 throw e; } finally { // (1), (2), (3) どの場合でもこのブロックは必ず実行される。 // ここにreturn文があるときはtry/catchブロックにreturn文があろうともこちらのreturn文が優先される。 ... }}
※この「例外処理」の解説は、「キーワード (Java)」の解説の一部です。
「例外処理」を含む「キーワード (Java)」の記事については、「キーワード (Java)」の概要を参照ください。
- 例外処理のページへのリンク