在不使用while循环的情况下找到最内部的异常?

Dan*_* T. 76 .net c# exception-handling exception while-loop

当C#抛出异常时,它可能有一个内部异常.我想要做的是获取最内部的异常,或者换句话说,没有内部异常的叶子异常.我可以在while循环中执行此操作:

while (e.InnerException != null)
{
    e = e.InnerException;
}
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有一些我可以使用的单行代替.

Dra*_*ter 127

Oneliner :)

while (e.InnerException != null) e = e.InnerException;
Run Code Online (Sandbox Code Playgroud)

显然,你不能让它变得更简单.

正如Glenn McElhoe的回答中所说,这是唯一可靠的方式.

  • 这有效,而`Exception.GetBaseException()`不适合我. (8认同)
  • GetBaseException()方法执行此操作w/oa循环.http://msdn.microsoft.com/en-us/library/system.exception.getbaseexception.aspx (6认同)

Jos*_*eld 118

我相信Exception.GetBaseException()这些解决方案也是如此. http://msdn.microsoft.com/en-us/library/system.exception.getbaseexception(v=vs.71).aspx

警告:从各种评论我们已经发现它并不总是字面上做同样的事情,并且在某些情况下递归/迭代解决方案会让你更进一步.它通常是最内部的异常,由于某些类型的异常覆盖了默认值,因此令人失望地不一致.但是,如果你捕获特定类型的异常并且合理地确定它们不是奇怪的(比如AggregateException)那么我会期望它获得合法的最内层/最早的异常.

  • 出于某种原因,`GetBaseException()`没有返回第一个根异常. (4认同)
  • Glenn McElhoe指出,确实GetBaseException()并不总是做MSDN建议我们通常所期望的("异常是一个或多个后续异常的根本原因").在AggregateException中,它仅限于同一类型的最低异常,也许还有其他异常. (4认同)
  • +1没有什么比知道BCL更能避免错综复杂的解决方案了.显然,这是最正确的答案. (3认同)
  • GetBaseException()对我不起作用,因为最顶层的异常是AggregateException。 (2认同)

小智 18

通过InnerExceptions循环是唯一可靠的方法.

如果捕获的异常是AggregateException,则GetBaseException()仅返回最内层的AggregateException.

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


dtb*_*dtb 12

如果您不知道嵌套内部异常的深度,则无法绕过循环或递归.

当然,您可以定义一个抽象方法来抽象它:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)


Mat*_*att 10

我知道这是一个老帖子,但我很惊讶没有人建议GetBaseException()哪个是Exception课堂上的方法:

catch (Exception x)
{
    var baseException = x.GetBaseException();
}
Run Code Online (Sandbox Code Playgroud)

这是自.NET 1.1以来的问题.这里的文档:http: //msdn.microsoft.com/en-us/library/system.exception.getbaseexception(v = vs.71).aspx