如何使此调用记录我的异常递归

本文关键字:异常 递归 我的 记录 何使此 调用 | 更新日期: 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>";
}

调用时,它会格式化异常消息。但是我想让它包括InnerExceptionInnerException.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();

在您的情况下,通过您自己的例外...