我有以下代码:
protected string formatException(Exception e)
{
var exError = "<form>";
if (e == null)
{
throw new ArgumentNullException("e");
}
exError += "<fieldset><legend><a href='#'>" +
"<span class='show-expanded'>collapse message</span>" +
"<span class='show-collapsed'>expand message</span>" +
"</a></legend><p>" + e.Message + "</p></fieldset>";
exError += "<fieldset><legend><a href='#'>" +
"<span class='show-expanded'>collapse trace</span>" +
"<span class='show-collapsed'>expand trace</span>" +
"</a></legend><p>" + e.StackTrace + "</p></fieldset>";
if (e.InnerException != null)
{
// same functionality but for the inner exception and the InnerException.InnerException
}
return exError + "</form>";
}
当被调用时,它会格式化异常消息。但是,我想让它包括InnerException
和InnerException.InnerException
有没有什么方法可以递归地做这件事,或者将消息格式放在另一个函数中并调用它会更好?
发布于 2012-05-24 12:53:00
这就是我要做的:
protected string formatException(Exception e)
{
Func<string, string> createFieldSet =
t =>
"<fieldset><legend><a href='#'>" +
"<span class='show-expanded'>collapse message</span>" +
"<span class='show-collapsed'>expand message</span>" +
"</a></legend><p>" + t + "</p></fieldset>";
var exError = new StringBuilder("<form>");
if (e == null)
{
throw new ArgumentNullException("e");
}
while (e != null)
{
exError.AppendLine(createFieldSet(e.Message));
exError.AppendLine(createFieldSet(e.StackTrace));
e = e.InnerException;
}
exError.AppendLine("</form>");
return exError.ToString();
}
发布于 2016-06-22 23:22:16
我知道这是一个古老的问题,而且已经有了一个标记的答案。然而,这就是我如何做到这一点,我将在这里发布这篇文章,以防它对某人有帮助:
public static class ExceptionExtension
{
public static string GetFullTrace(this Exception ex, bool recursive = true)
{
string trace = "";
trace += "Name: " + ex.GetType().Name + "\n";
trace += "Message: " + ex.Message + "\n";
trace += "Stack Trace: " + (ex.StackTrace ?? "null") + "\n";
if (recursive)
{
while (ex.InnerException != null)
{
ex = ex.InnerException;
trace += "\n-------------------- Caused by: --------------------\n";
trace += "Name: " + ex.GetType().Name + "\n";
trace += "Message: " + ex.Message + "\n";
trace += "Stack Trace: " + (ex.StackTrace ?? "null") + "\n";
}
}
return trace;
}
}
与前面的答案略有不同的是,使用了扩展方法。这样一来,我们可以简单地将其称为:
try
{
SomeOperationWhichMayThrow();
}
catch(Exception ex)
{
LogError(ex.GetFullTrace());
}
我有一个项目,其中包含许多可重用的实用程序和扩展方法,我在大多数项目中都包含了这些工具和扩展方法。ExceptionExtension
就是这些工具中的一个。
为了获得更好的性能,请考虑改用StringBuilder
。
发布于 2012-05-24 12:40:07
试着使用像这样的东西
Exception ex = e;
while (ex != null)
{
string s = ex.Message;
ex = ex.InnerException;
}
https://stackoverflow.com/questions/10731206
复制相似问题