在C#抛出异常时,它可能会有一个内部异常。我的目标是获取最内层的异常,或者换句话说,是没有内部异常的叶子异常。我可以使用while循环来实现:
while (e.InnerException != null)
{
e = e.InnerException;
}
但我想知道是否有一行代码可以做到这一点。
在C#抛出异常时,它可能会有一个内部异常。我的目标是获取最内层的异常,或者换句话说,是没有内部异常的叶子异常。我可以使用while循环来实现:
while (e.InnerException != null)
{
e = e.InnerException;
}
但我想知道是否有一行代码可以做到这一点。
while (e.InnerException != null) e = e.InnerException;
显然,你不能再简单了。
如Glenn McElhoe在这篇答案中所说,这是唯一可靠的方法。
Exception.GetBaseException()
对我无效。 - Tarik我相信 Exception.GetBaseException()
执行与这些解决方案相同的操作。
注意:从各种评论中,我们已经发现它并不总是字面上执行相同的操作,并且在某些情况下,递归/迭代解决方案会让你更进一步。通常它是最内部的异常,但由于某些类型的异常覆盖了默认值,这是令人失望的不一致的。但是,如果你捕获特定类型的异常并合理地确定它们不是奇怪的东西(比如 AggregateException),那么我希望它会得到合法的最内部/最早的异常。
GetBaseException()
对我没有用,因为最顶层的异常是一个 AggregateException。 - Chris Ballance循环遍历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();
}
public Exception GetFirstException(Exception ex)
{
if(ex.InnerException == null) { return ex; } // end case
else { return GetFirstException(ex.InnerException); } // recurse
}
使用:
try
{
// some code here
}
catch (Exception ex)
{
Exception baseException = GetFirstException(ex);
}
public static Exception GetFirstException(this Exception ex)
{
if(ex.InnerException == null) { return ex; } // end case
else { return GetFirstException(ex.InnerException); } // recurse
}
使用:
try
{
// some code here
}
catch (Exception ex)
{
Exception baseException = ex.GetFirstException();
}
public static Exception GetOriginalException(this Exception ex) { if (ex.InnerException == null) return ex; return ex.InnerException.GetOriginalException(); }
- KiquenetAggregateException.InnerExceptions
不适用吗? - KiquenetList<Exception> es = new List<Exception>();
while(e.InnerException != null)
{
es.add(e.InnerException);
e = e.InnerException
}
Exception.GetBaseException()
。Try
//Your code
Catch ex As Exception
MessageBox.Show(ex.GetBaseException().Message, My.Settings.MsgBoxTitle, MessageBoxButtons.OK, MessageBoxIcon.Error);
End Try
public static string GetExceptionMessages(Exception ex)
{
if (ex.InnerException is null)
return ex.Message;
else return $"{ex.Message}\n{GetExceptionMessages(ex.InnerException)}";
}
虽然不是一行代码,但很接近:
Func<Exception, Exception> last = null;
last = e => e.InnerException == null ? e : last(e.InnerException);
LibraryException -> LibraryException -> LibraryException -> MyException
。我的异常始终是链上的最后一个,并且没有自己的内部异常。 - Daniel T.