9

質問に対する回答を検索しましたが、見つかりませんでした。答えがそこにあり、私が重複している場合はお詫びします!

..... などの try/catch コードが引き続き表示されます。

try
{
    //Do whatever
}
catch (Exception ex)
{
    MessageBox.Show("Oops, something went wrong!");
}

これにより、警告 ex is never used が発生します。

だから私の質問は... ex は決して使用されませんが、宣言に利点はありますか? スタックトレースに詳細を追加するかもしれないと言われましたか? 警告を停止する catch(Exception) が表示されることがありますが、これによりどのような利点が得られるのでしょうか? 私がこれを書いて、例外をまったく使用しない場合、私は ex を宣言しません...

try
{
    //Do whatever
}
catch
{
    MessageBox.Show("Oops, something went wrong!");
}

大きな問題ではありませんが、確かに知っておくとよいでしょう!

ありがとう

フレッド

4

8 に答える 8

10

次のパターンを使用して、変数を使用せずに特定の例外の種類を宣言して、構造化例外処理 (SEH) が引き続き発生していることを確認できます。

try
{
    //Do whatever
}
catch (IOException)
{
    MessageBox.Show("Oops, something went wrong in the IO!");
}
catch (Exception)
{
    MessageBox.Show("Oops, something went wrong!");
}

再スローしない場合は例外の詳細をログに記録する可能性があるため、これは私が通常使用するプラクティスではありません。

于 2012-08-15T09:50:27.597 に答える
3

通常、例外を抑制するのは悪い形です...例外をスタックに移動させます。

「詳細の追加」に関してはthrow、スタック トレースを保持するために使用して例外を再スローします。そうしないと、詳細が失われます。繰り返しますが、それをまったくキャッチしないという代替手段があります。例外 (回復、アンワインドなど) を使用しない場合は、例外をキャッチする正当な理由がない可能性があります。

参照: C# で例外を再スローする適切な方法は何ですか?

参照: 「基本に戻る - 例外」

于 2012-08-15T09:49:28.293 に答える
3

投稿された 2 つのコード ブロックには違いがあることに注意してください。 catch (Exception ex)CLR 定義の例外 (から派生したもの) のみをキャッチしますExceptioncatch単独では、CLR 自体がキャッチまたはラップしていないアンマネージ例外を含め、何でもキャッチします。

コードの動作を変更せずにコンパイラの警告を回避したい場合、または特定の例外タイプをキャッチしながら警告を回避したい場合は、代わりにこれを使用できます。

catch (Exception)
{
}

ここでの利点は、具体的にできることです:catch (SqlException)たとえば。変数を使用していない場合、宣言すると警告が表示されますが、型固有の動作は引き続き役立ちます。

とにかく、例外を明示的にラップおよび/または再スローしない限り、例外を宣言しても情報 (スタック トレースなど) には何も追加されません。(ちなみに、throw ex再スローには使用しないでください。情報失われるためです。単に を使用してくださいthrow。)

于 2012-08-15T09:49:35.677 に答える
1

例外で何もしたくない場合は、次のようにしてコンパイラの警告を回避することもできます。

catch (Exception)
{
  // Stick our head in the sand
}

(または単にキャッチ)

于 2012-08-15T09:49:52.113 に答える
1

それはすべて、開発者と、後のタームで適切なロギング/デバッグを実装する彼の能力に関するものです...

これ:

catch (Exception ex)
{
    MessageBox.Show("Oops, something went wrong!");
}

に簡単に変換できます

catch (Exception ex)
{
    Log.Append(ex);
    MessageBox.Show("Oops, something went wrong. Please check the Log file.");
}

行ごとに実行するときにデバッグするためだけにある場合があり、行にブレークポイントを設定して変数MessageBox.Showを読み取ることができます。ex

便利ですが、コンパイル時に使用しないと、変数が宣言されていて使用されていないという警告exが表示されるため、それらすべてを追跡してログに記録するか、削除することができます。

繰り返しますが、それはすべてプログラマーの選択に関するものであり、... 未使用の変数は、終了プログラムではそれほど問題になりません。

于 2012-08-15T09:51:57.387 に答える
1

exロギング、メッセージングなど、後で使用するためにその変数を使用できます。

try
{
    //Do whatever
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);

}

後で開発者がログを見て何が問題なのかを判断できるように、例外をログに記録したいとします。その場合ex、ロギングに必要なすべての必要な詳細が保持されます。例: StackTrace、Message、InnerException (存在する場合) など。

ご質問について:

ex は使用されませんが、宣言に利点はありますか?

使用しない場合は、宣言するメリットはありません。

スタックトレースに詳細を追加するかもしれないと言われましたか?

よくわかりませんが、そうではないと思います。定義すると、例外のスタック トレースが含まれますが、何も追加されません。

警告を停止する catch(Exception) が表示されることがありますが、これによりどのような利点が得られるのでしょうか?

キーワードを使用して例外を再スローするthrow場合は、使用できますcatch(Exception)

于 2012-08-15T09:47:21.387 に答える
0

実行時例外オブジェクトへのException ex参照となる には、複数の利点があります。開発者は、テキスト ファイルにログを記録したり、自分自身にレポートを送信したりできます。

MSDN のドキュメントの時点で:

パラメーターなしの catch 句によって現在処理されている例外を再スローする場合は、引数なしで throw ステートメントを使用します。

http://msdn.microsoft.com/en-us/library/0yd65esw%28v=vs.80%29.aspx

于 2012-08-15T09:52:20.257 に答える
0

いいえ、実際に使用しない限り、宣言しても意味がありません。

于 2012-08-15T09:47:38.993 に答える