Câu hỏi này nhằm áp dụng cho bất kỳ ngôn ngữ lập trình OO nào hỗ trợ xử lý ngoại lệ; Tôi đang sử dụng C # cho mục đích minh họa.
Các ngoại lệ thường được nêu ra khi có vấn đề phát sinh mà mã không thể xử lý ngay lập tức và sau đó bị bắt trong một catch
mệnh đề ở một vị trí khác (thường là khung ngăn xếp bên ngoài).
H: Có bất kỳ tình huống hợp pháp nào mà các ngoại lệ không bị ném và bị bắt, mà chỉ được trả về từ một phương thức và sau đó được chuyển qua dưới dạng các đối tượng lỗi không?
Câu hỏi này được đặt ra cho tôi bởi vì System.IObserver<T>.OnError
phương pháp của .NET 4 gợi ý rằng: các ngoại lệ được truyền xung quanh dưới dạng các đối tượng lỗi.
Hãy xem xét một kịch bản khác, xác nhận. Giả sử tôi đang theo sự khôn ngoan thông thường và do đó tôi đang phân biệt giữa một loại đối tượng lỗi IValidationError
và một loại ngoại lệ riêng biệt ValidationException
được sử dụng để báo cáo các lỗi không mong muốn:
partial interface IValidationError { }
abstract partial class ValidationException : System.Exception
{
public abstract IValidationError[] ValidationErrors { get; }
}
(Không System.Component.DataAnnotations
gian tên làm một cái gì đó khá giống nhau.)
Những loại này có thể được sử dụng như sau:
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(…)
}
Bây giờ tôi đang tự hỏi, tôi có thể không đơn giản hóa những điều trên để này:
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: Những lợi thế và bất lợi của hai phương pháp khác nhau này là gì?
AggregateException
thay thế? Điểm tốt.