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());
}