C# 如何进行此调用以记录异常递归?
我有以下代码:C# 如何进行此调用以记录异常递归?,c#,exception,inner-exception,C#,Exception,Inner Exception,我有以下代码: protected string formatException(Exception e) { var exError = "<form>"; if (e == null) { throw new ArgumentNullException("e"); } exError += "<fieldset><legend><a href='#'>
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>";
}
受保护字符串格式异常(异常e)
{
var exeror=“”;
如果(e==null)
{
抛出新的异常(“e”);
}
练习者+=“”+e.信息+””;
exError+=“”+e.StackTrace+“”;
如果(例如,InnerException!=null)
{
//功能相同,但用于内部异常和InnerException.InnerException
}
返回exercor+“”;
}
调用时,它将格式化异常消息。但是,我想让它包括InnerException
和InnerException.InnerException
是否有某种方法可以递归地执行此操作,或者最好将消息格式放在另一个函数中并调用它?尝试使用类似的方法
Exception ex = e;
while (ex != null)
{
string s = ex.Message;
ex = ex.InnerException;
}
我不确定下面的代码是否能解决这个问题。它可能需要一些格式
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>";
}
受保护字符串格式异常(异常e)
{
var exeror=“”;
如果(e==null)
{
抛出新的异常(“e”);
}
练习者+=“”+e.信息+””;
exError+=“”+e.StackTrace+“”;
如果(例如,InnerException!=null)
{
exError+=formatException(例如InnerException);
}
返回exercor+“”;
}
编辑
受保护字符串格式异常(异常e)
{
如果(e==null)
{
抛出新的异常(“e”);
}
var exeror=“”;
exError+=格式例外内部(e);
返回exercor+“”;
}
专用字符串格式ExceptionInternal(异常e)
{
var exeror=“”;
练习者+=“”+e.信息+””;
exError+=“”+e.StackTrace+“”;
如果(例如,InnerException!=null)
{
exError+=FormatExceptionInternal(即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();
}
受保护字符串格式异常(异常e)
{
Func创建字段集=
t=>
“”+t+“”;
var exeror=新的StringBuilder(“”);
如果(e==null)
{
抛出新的异常(“e”);
}
while(e!=null)
{
exercorr.AppendLine(createFieldSet(e.Message));
exError.AppendLine(createFieldSet(e.StackTrace));
e=e.InnerException;
}
执行人附录行(“”);
返回exercor.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>";
}
私有字符串privateFormatException(异常e)
{
var exeror=String.Empty;
如果(e==null)
{
回报行使人;
}
练习者+=“”+e.信息+””;
exError+=“”+e.StackTrace+“”;
返回exError+privateFormatException(例如InnerException);
}
受保护的字符串格式异常(异常e)
{
var exeror=“”;
如果(e==null)
{
抛出新的异常(“e”);
}
exError+=私有格式例外(e);
返回exercor+“”;
}
您的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;
}
受保护字符串格式异常(异常e)
{
var exeror=string.Empty;
如果(e==null)
{
抛出新的异常(“e”);
}
练习者+=“”+e.信息+””;
exError+=“”+e.StackTrace+“”;
如果(例如,InnerException!=null)
{
exError+=formatException(例如InnerException);
}
回报行使人;
}
你可以这样调用这个函数,我希望它也能用于递归。。
使用上述方法是可行的
StringBuilder sb = new StringBuilder();
sb.Append("<form>");
sb.Append(formatException(new Exception()));// pass your own exception
sb.Append("</form>");
string strException = sb.ToString();
StringBuilder sb=新建StringBuilder();
某人加上(“”);
sb.Append(formatException(newexception());//传递您自己的异常
某人加上(“”);
字符串strException=sb.ToString();
在你的情况下,通过你自己的例外…我知道这是一个老问题,已经有了一个标记的答案。但是,我就是这样做的,我会在这里发布,以防它对某人有所帮助:
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 < /C> >。不能在HTML中嵌套表单,因此必须从递归调用中删除表单标记。
try
{
SomeOperationWhichMayThrow();
}
catch(Exception ex)
{
LogError(ex.GetFullTrace());
}