Pertanyaan ini dimaksudkan untuk diterapkan pada bahasa pemrograman OO yang mendukung penanganan pengecualian; Saya menggunakan C # untuk tujuan ilustrasi saja.
Pengecualian biasanya dimaksudkan untuk dimunculkan ketika masalah muncul bahwa kode tidak dapat segera ditangani, dan kemudian ditangkap dalam catch
klausa di lokasi yang berbeda (biasanya bingkai tumpukan luar).
T: Apakah ada situasi yang sah di mana pengecualian tidak dilemparkan dan ditangkap, tetapi hanya dikembalikan dari metode dan kemudian diedarkan sebagai objek kesalahan?
Pertanyaan ini muncul untuk saya karena System.IObserver<T>.OnError
metode .NET 4 menyarankan hanya itu: pengecualian dilewatkan sebagai objek kesalahan.
Mari kita lihat skenario lain, validasi. Katakanlah saya mengikuti kebijakan konvensional, dan karena itu saya membedakan antara tipe objek kesalahan IValidationError
dan tipe pengecualian terpisah ValidationException
yang digunakan untuk melaporkan kesalahan tak terduga:
partial interface IValidationError { }
abstract partial class ValidationException : System.Exception
{
public abstract IValidationError[] ValidationErrors { get; }
}
( System.Component.DataAnnotations
Namespace melakukan sesuatu yang sangat mirip.)
Jenis-jenis ini dapat digunakan sebagai berikut:
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(…)
}
Sekarang saya bertanya-tanya, dapatkah saya menyederhanakan hal di atas menjadi ini:
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>
}
T: Apa kelebihan dan kekurangan dari dua pendekatan yang berbeda ini?
AggregateException
? Poin bagus.