[c#] while 루프를 사용하지 않고 가장 안쪽의 예외를 찾으십니까?

C #에서 예외가 발생하면 내부 예외가있을 수 있습니다. 내가 원하는 것은 가장 안쪽의 예외, 즉 내부 예외가없는 리프 예외를 얻는 것입니다. while 루프에서이 작업을 수행 할 수 있습니다.

while (e.InnerException != null)
{
    e = e.InnerException;
}

그러나 나는 이것을 대신 사용할 수있는 한 줄짜리가 있는지 궁금했습니다.



답변

짧막 한 농담 🙂

while (e.InnerException != null) e = e.InnerException;

분명히 더 간단하게 만들 수는 없습니다.

Glenn McElhoe 의이 답변 에서 말했듯이 이것이 유일한 신뢰할 수있는 방법입니다.


답변

나는 Exception.GetBaseException()이러한 솔루션과 동일한 일을 한다고 생각 합니다.

주의 사항 : 다양한 의견을 통해 우리는 항상 문자 그대로 같은 일을 . 어떤 경우에는 재귀 / 반복 솔루션이 더 입니다. 그것은이다 일반적으로 , 기본을 무시 예외 특정 유형의 덕분에 실망 일관성이 가장 안쪽의 예외입니다. 그러나 특정 유형의 예외를 포착하고 (AggregateException과 같은) 이상한 것이 아닌지 합리적으로 확인하면 합법적 인 가장 안쪽 / 가장 빠른 예외가 발생할 것으로 예상합니다.


답변

InnerExceptions를 통해 반복하는 것이 유일한 신뢰할 수있는 방법입니다.

발견 된 예외가 AggregateException이면 GetBaseException()가장 안쪽에있는 AggregateException 만 반환합니다.

http://msdn.microsoft.com/en-us/library/system.aggregateexception.getbaseexception.aspx


답변

내부 예외가 얼마나 깊이 중첩되어 있는지 모르는 경우 루프 또는 재귀를 피할 방법이 없습니다.

물론이를 추상화하는 확장 메서드를 정의 할 수 있습니다.

public static class ExceptionExtensions
{
    public static Exception GetInnermostException(this Exception e)
    {
        if (e == null)
        {
            throw new ArgumentNullException("e");
        }

        while (e.InnerException != null)
        {
            e = e.InnerException;
        }

        return e;
    }
}


답변

나는 이것이 오래된 게시물이라는 것을 알고 있지만 아무도 수업 GetBaseException()의 방법을 제안하지 않은 것에 놀랐습니다 Exception.

catch (Exception x)
{
    var baseException = x.GetBaseException();
}

이것은 .NET 1.1 이후로 발생했습니다. 문서 :
http://msdn.microsoft.com/en-us/library/system.exception.getbaseexception(v=vs.71).aspx


답변

때로는 내부 예외가 많을 수 있습니다 (많은 버블 예외). 어떤 경우에 다음을 수행 할 수 있습니다.

List<Exception> es = new List<Exception>();
while(e.InnerException != null)
{
   es.add(e.InnerException);
   e = e.InnerException
}


답변

한 줄은 아니지만 닫습니다.

        Func<Exception, Exception> last = null;
        last = e => e.InnerException == null ? e : last(e.InnerException);