如何使此调用记录我的异常递归
本文关键字:异常 递归 我的 记录 何使此 调用 | 更新日期: 2023-09-27 18:35:14
我有以下代码:
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
有没有办法递归地做到这一点,或者将消息格式放在另一个函数中并调用它会更好吗?
我知道
这是一个古老的问题,并且已经有一个标记的答案。但是,这就是我的做法,我将在此处发布此内容,以防它对某人有所帮助:
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
。
尝试使用类似的东西
Exception ex = e;
while (ex != null)
{
string s = ex.Message;
ex = ex.InnerException;
}
这是我要做的:
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();
}
我会这样做:
private string privateFormatException(Exception e)
{
var exError = String.Empty;
if (e == null)
{
return exError;
}
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>";
return exError + privateFormatException(e.InnerException);
}
protected string formatException(Exception e)
{
var exError = "<form>";
if (e == null)
{
throw new ArgumentNullException("e");
}
exError += privateFormatException(e);
return exError + "</form>";
}
我不确定以下代码是否可以解决它。它可能需要某种格式。
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)
{
exError += formatException(e.InnerException);
}
return exError + "</form>";
}
编辑
protected string FormatException(Exception e)
{
if (e == null)
{
throw new ArgumentNullException("e");
}
var exError = "<form>";
exError += FormatExceptionInternal(e);
return exError + "</form>";
}
private string FormatExceptionInternal(Exception e)
{
var exError = "";
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)
{
exError += FormatExceptionInternal(e.InnerException);
}
return exError;
}
你的 FormatException 方法应该是这样的,不需要将 exError 变量声明为类级别,在函数中声明它并返回。
protected string formatException(Exception e)
{
var exError = string.Empty;
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)
{
exError += formatException(e.InnerException);
}
return exError;
}
你可以像这样调用这个函数,我希望它也适用于递归。使用上述方法是
StringBuilder sb = new StringBuilder();
sb.Append("<form>");
sb.Append(formatException(new Exception()));// pass your own exception
sb.Append("</form>");
string strException = sb.ToString();
在您的情况下,通过您自己的例外...