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的回答中所说,这是唯一可靠的方式.
Jos*_*eld 118
我相信Exception.GetBaseException()
这些解决方案也是如此.
http://msdn.microsoft.com/en-us/library/system.exception.getbaseexception(v=vs.71).aspx
警告:从各种评论我们已经发现它并不总是字面上做同样的事情,并且在某些情况下递归/迭代解决方案会让你更进一步.它通常是最内部的异常,由于某些类型的异常覆盖了默认值,因此令人失望地不一致.但是,如果你捕获特定类型的异常并且合理地确定它们不是奇怪的(比如AggregateException)那么我会期望它获得合法的最内层/最早的异常.
小智 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