0

私が取り組んでいるアプリの場合、チームメイトの 1 人が、システムの 1 つが比較的高いレベルで例外的な状態になったときにチームにレポートを実行する汎用エラー ハンドラーに取り組んでいます。

ただし、数週間前に、通知を提供する低レベル (具体的にはデータベース アクセス) のコードをいくつか書きました。このチーム メンバーのハイレベル コードの出現により、チームの他のメンバーは、私の try/catch システムを安全に削除できると感じています。

1 つの落とし穴:IsSuccessfulこの特定のリポジトリ メソッドから返されるデータ構造にフラグがあります。例外が発生すると、このフラグは false のままになります (データ取得が成功すると、フラグは true に設定されます)。

したがって、当分の間、私のコードは次のようになります。

public FooResult Foo()
{
  FooResult result = new FooResult { IsSuccessful = false };
  SqlParameter[] args = new []
  {
    // Some args, immaterial to the situation.
  }

  try
  {
    DataSet ds = SqlHelper.ExecuteDataset(_connection, CommandType.Text, query, args);
    result = new FooResult
             {
               IsSuccessful = true,
               // ...Other fields are set...
             };
  }
  catch
  {
    result.IsSuccessful = false;
    throw;   // Per request
  }

  return result;
}

これは私の質問につながります:例外をスローし、それがより高いレベルで処理されると、その後どうなりますか? コードは中断したところにバブルダウンしますか、それとも別の場所で実行が再開されますか? 問題が発生し、別のレベルでクリーンアップされた場合、コードはどこに進みますか?

4

2 に答える 2

1

内部で作成しているFooResultオブジェクトはFoo()、例外をスローすると返されません。

例外は、コードの通常の制御フローを中断し、誰かが例外をキャッチするか、プログラムが完全に停止するまで泡立ち続けます。

より高いレベルが例外をキャッチして再試行する可能性がありますが、それはメソッドの手に負えません。

于 2013-04-03T19:56:07.847 に答える
1

例外をスローすると が強制stack unwindingされます。これは、現在の実行スタックが破棄され、最終的にはcatch().
つまり、exception呼び出し元のメソッドで an をキャッチすると、最終的に istcatch()ハンドラーになり、呼び出し先で例外が発生した場所には戻りません。したがって、return ステートメントがある場合、これには決して到達しません。

ここにこれに関する素敵な短い記事があります。

于 2013-04-03T19:55:05.593 に答える