我在一个相当复杂的环境中工作,有时真正的异常是几层深层的内部异常...所以我很想写这样的代码:
Dim innerEx = ex.InnerException
While innerEx IsNot Nothing
innerEx = innerEx.InnerException
End While
但是,根据MSDN documentation,ToString方法在其InnerException上调用ToString ...因为这是一个例外,我可以假设它会递归地工作吗?
答案 0 :(得分:4)
除非最外层的异常决定覆盖ToString()而不调用基本版本,否则它将完全递归。然后,该方法返回被覆盖的版本决定返回的任何内容。因此,非常不鼓励开发人员在自己的异常中覆盖ToString,以便在可预测的异常上保持调用ToString()的行为。
顺便说一句,如果任何内部异常覆盖ToString(),它不就会重要,因为在递归过程中公共(虚拟)ToString()方法不是用过的。而是调用私有方法ToString(bool)来完成所有工作,并在必要时调用内部异常。
答案 1 :(得分:0)
我做过类似的事情: FormatException
public static string FormatErrorMessage(Exception ex)
{
var result = "Exception: " + ex.GetType().Namespace + "." + ex.GetType().Name + "\r\n";
result += "******Exception message****\r\n";
result += ex.Message + "\r\n\r\n";
if (string.IsNullOrEmpty(ex.StackTrace) == false)
{
result += "******Stack trace**********\r\n";
result += ex.StackTrace + "\r\n\r\n";
}
if (ex.InnerException != null)
{
result += "******Inner exception******\r\n";
result += FormatErrorMessage(ex.InnerException);
}
return result;
}