이 질문은 예외 처리를 지원하는 모든 OO 프로그래밍 언어에 적용됩니다. 설명 목적으로 만 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 : 이 두 가지 접근 방식의 장단점은 무엇입니까?
AggregateException
대신 던지는 경우를 의미 합니까? 좋은 지적.