1

私の最後のプログラミング演習からしばらく経ちましたので、ここにかなり基本的な質問があります。しかし、具体的な答えはまだ見つかりませんでした。

例外を引き起こす可能性のあるメソッドを定義したとしましょう。メソッドは次のようになります(かなり擬似コードで):

public int Calculate(int x, int y) 
{
  try 
  {
    doSomeCalc();
  }
  catch (SomeException ex) 
  {
    doExceptionHandling();
  }

  return result;
}

アプリケーションの別の部分がこのメソッドを使用したい場合、別のtry-catchブロックを使用する必要がありますか?

public MyMainApp() {
  try 
  {
    Calculate(1, 2);
  } 
  catch (SomeException ex) 
  {
    doExceptionHandling();
  }
}

したがって、ここでの問題は、try-catchをどこで使用する必要があり、どこで不要なのかということです。

4

6 に答える 6

8

一般に、キャッチで実行できることがある場合にのみ、トライキャッチを使用する必要があります。失敗した接続を再試行するか、それ以外の方法でユーザーが続行できるようにしますか?例外をログに記録しますか?

回復したり、正常に劣化させたりするためにできることがない場合は、例外をキャッチしても意味がありません。アプリの上部(たとえば、WebアプリのベースページのPage_Errorイベント)でキャッチするまでバブルさせて、そこでUIを処理します。

于 2013-03-08T15:11:05.250 に答える
2

一般に、特定のステートメントの実行によるエラーの原因を処理する必要がある場合は、try-catchを使用する必要があります。

たとえば、Db接続の場合、、などのSqlExceptionエラーに関連する情報を持つことができるが発生します。Wrong PasswordInvalid Database

try
{
    //try connect to db
}
catch (SqlException ex)
{
    // information of database related exception
}
catch (Exception ex)
{
    // catch any other error
}

Exception Handling当時は見た目ほど単純ではありません。

この記事を読んでください(私は個人的にそれから多くを学びました):.NETでの例外処理のベストプラクティス

于 2013-03-08T15:11:27.527 に答える
2

Calculateすでに例外をキャッチして処理している場合、なぜそれを気MyMainAppにする必要があるのでしょうか。それがそれを捕まえないならば、それMyMainAppを扱いたいかもしれません。それが有用な方法でそれを処理しない場合(少なくとも例外をログに記録する)、それはそれを捕らえるべきではありません。

ベストプラクティスは、意味のある例外をできるだけ早くスローすることです。たとえば、(負の値が誤った結果や例外を引き起こす可能性があると想定して):

public int Calculate(int x, int y)
{
    if (x <= 0)
        throw new ArgumentException("X has to be positive", "x");
    if (y <= 0)
        throw new ArgumentException("Y has to be positive", "y");

    // now the calculation should be safe without any side-effects
    // ...
}
于 2013-03-08T15:15:03.360 に答える
1

タイプによって異なりますSomeException。それがすべての例外の基本クラスである場合、いいえ、2番目のブロックでは必要ありません。ただし、特定の種類の例外のみを処理し、他の種類の例外が発生する可能性がある場合は、2番目のブロックが必要です。特定の例外を1つだけ処理する必要があるのはなぜですか?それはあなたが必要に応じて見つけるためのものです:)

于 2013-03-08T15:10:16.957 に答える
1

経験則では、例外を除いて、何かをしようとしている場所だけをキャッチします。たとえば、特定の例外をログに記録したり、呼び出しを再試行したりします。

スタックトレースを維持するには、通常、を使用して例外を再スローしthrow;、プロセスの先頭にエラーをグローバルに処理するメカニズムを設定します。

于 2013-03-08T15:10:23.757 に答える
0

通常の関数はイベント関数からのみ呼び出されるため、 tryとcatchを内部に配置してみてください。またevent functions、一部を実行する場合は、他のレイヤー関数でのみtryを使用してくださいrollbacks。それが役に立てば幸い....

于 2013-03-08T15:10:15.593 に答える