この質問は、例外処理をサポートするオブジェクト指向プログラミング言語に適用されることを意図しています。説明目的でのみC#を使用しています。
通常、例外は、コードがすぐに処理できない問題が発生したときに発生catch
し、別の場所(通常は外部スタックフレーム)の句でキャッチされることを目的としています。
Q:例外がスローおよびキャッチされず、メソッドから単純に返され、エラーオブジェクトとして渡される正当な状況はありますか?
この質問は、.NET 4のSystem.IObserver<T>.OnError
メソッドが次のことを示唆しているために思いつきました。例外はエラーオブジェクトとして渡されます。
別のシナリオ、検証を見てみましょう。私が従来の知恵に従っているとしましょう。したがって、エラーオブジェクトタイプIValidationError
と、ValidationException
予期しないエラーの報告に使用される別の例外タイプを区別しています。
partial interface IValidationError { }
abstract partial class ValidationException : System.Exception
{
public abstract IValidationError[] ValidationErrors { get; }
}
(System.Component.DataAnnotations
名前空間は非常に似たようなことをします。)
これらのタイプは次のように使用できます。
partial interface IFoo { } // an immutable type
partial interface IFooBuilder // mutable counterpart to prepare instances of above type
{
bool IsValid(out IValidationError[] validationErrors); // true if no validation error occurs
IFoo Build(); // throws ValidationException if !IsValid(…)
}
今、私はこれを上記に単純化できないのではないかと思っています。
partial class ValidationError : System.Exception { } // = IValidationError + ValidationException
partial interface IFoo { } // (unchanged)
partial interface IFooBuilder
{
bool IsValid(out ValidationError[] validationErrors);
IFoo Build(); // may throw ValidationError or sth. like AggregateException<ValidationError>
}
Q:これら2つの異なるアプローチの利点と欠点は何ですか?
AggregateException
代わりに投げるという意味ですか?いい視点ね。