Bu soru, istisna işlemeyi destekleyen herhangi bir OO programlama diline uygulanmaya yöneliktir; C # yalnızca örnekleme amaçlı kullanıyorum.
İstisnalar, genellikle, kodun hemen ele alınamayacağı bir sorun ortaya çıktığında ortaya çıkar ve daha sonra catch
farklı bir yerde (genellikle bir dış yığın çerçevesi) bir maddede yakalanır .
S: İstisnaların atılmadığı ve yakalanmadığı, sadece bir yöntemden döndürüldüğü ve daha sonra hata nesnesi olarak geçirildiği meşru durumlar var mı?
Bu soru benim için ortaya çıktı, çünkü .NET 4'ün System.IObserver<T>.OnError
metodu sadece şunu öneriyor: istisnalar hata nesnesi olarak aktarılıyor.
Başka bir senaryoya bakalım, doğrulama. Geleneksel bilgeliği takip ettiğimi ve bu nedenle bir hata nesnesi türü IValidationError
ile ValidationException
beklenmeyen hataları bildirmek için kullanılan ayrı bir istisna türü arasında ayrım yaptığımı varsayalım :
partial interface IValidationError { }
abstract partial class ValidationException : System.Exception
{
public abstract IValidationError[] ValidationErrors { get; }
}
( System.Component.DataAnnotations
Ad alanı oldukça benzer bir şey yapar.)
Bu türler aşağıdaki gibi kullanılabilir:
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(…)
}
Şimdi merak ediyorum, yukarıdakileri basitleştiremedim mi:
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>
}
S: Bu iki farklı yaklaşımın avantajları ve dezavantajları nelerdir?
AggregateException
yerine atma durumunda demek istiyorsun ? İyi bir nokta.