私が取り組んでいるアプリの場合、チームメイトの 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;
}
これは私の質問につながります:例外をスローし、それがより高いレベルで処理されると、その後どうなりますか? コードは中断したところにバブルダウンしますか、それとも別の場所で実行が再開されますか? 問題が発生し、別のレベルでクリーンアップされた場合、コードはどこに進みますか?