C#のthrowとthrow exの主な違いは、throwは例外が投げられた場所と実際の例外についての情報を提供するのに対し、throw exは例外が投げられた場所についての情報のみを提供することです。
C#は最新の汎用プログラミング言語です。
マルチスレッドのサポート、自動ガベージコレクション、ラムダ式、イベントなど、複数の利点を備えています。
例外とは、プログラム中に発生する問題です。
例外が発生すると、プログラムの実行を停止させることができます。
C#は例外を処理するためのメソッドを提供する。
プログラマはtry、catch、finally、throwキーワードを使用して例外を処理することができます。
また、例外を発生させる可能性のあるコードをtryブロックの中に記述することもできます。
catchは、例外の捕捉を示します。
終了文はfinallyブロックの中にある。
ただし、finallyブロックは必須ではありません。
throwキーワードは、問題が発生したときにプログラムが例外を投げることを可能にします。
もう一つのキーワードは「throw ex」です。
throwとthrow exの違いを見てみましょう。
C#のthrowとは
プログラマは、catchブロックの中でthrow文を使って例外を発生させ、その例外をログに記録することができます。
例えば、以下のようなプログラムです。
図1:throwを使ったC#プログラム
DivideByZeroというメソッドがあります。
これは整数のパラメータを受け取り、その数をゼロで割るというものです。
メインプログラムでは、tryブロックの中でDivideByZeroメソッドが呼び出されます。
このとき例外が発生し、catchブロックが実行されます。
catchブロックはthrowキーワードを持っているので、例外を投げることになります。
出力を見ると、スタックトレース情報を見ることができます。
これは、例外がどこで投げられたか(9行目)と、実際に例外が発生した場所(15行目)についての情報を提供します。
C#のthrow exとは
throwと同様に例外を発生させ、その例外を記録するためにcatchブロック内でthrow ex文を使用することができますが、若干の違いがあります。
図2:throw exを使用したC#プログラム
DivideByZeroというメソッドがあります。
これは整数のパラメータを受け取り、その数をゼロで割るというものです。
メインプログラムでは、tryブロックの中でDivideByZeroメソッドが呼び出されます。
このとき例外が発生し、catchブロックが実行されます。
catchブロックはthrow exキーワードを持っているので、例外を投げることになります。
出力を見ると、どこで例外が発生したかの情報は提供されていることがわかります(9行目)。
しかし、実際に例外がどこで投げられたかは示されていない。
したがって、throw ex は、すべてのスタックトレース情報を与えるわけではありません。
C#のthrowとthrow exの違い
定義
throwがプログラム実行中に例外が発生したことを示すキーワードであるのに対し、throw exはC#において例外が発生したことを示すキーワードであり、プログラマがスタックトレースをリセットすることが可能である。
これがC#のthrowとthrow exの主な違いです。
スタックトレース情報
また、C#のthrowとthrow exのもう一つの違いは、throwはスタックトレース情報を全て提供するのに対し、throw exはスタックトレース情報を全て提供しない点です。
機能性
さらに、C#のthrowとthrow exの重要な違いとして、機能性が挙げられます。
throwはスタックトレースをリセットしないので、プログラマは実際の例外に関する情報を得ることができます。
しかし、throw exはスタックトレースをリセットするため、throw exが書かれた行からエラーが表示されます。
結論
throw と throw ex はどちらも例外処理に役立ちます。
throw exとは異なり、throwはすべてのスタック情報を提供します。
C#のthrowとthrow exの主な違いは、throwは例外が投げられた場所と実際の例外に関する情報を提供し、throw exは例外が投げられた場所に関する情報のみを提供することです。
つまり、throw exよりもthrowを使う方が、正確なスタック情報を得られるので、良いプログラミング方法と言えます。