首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使此调用以递归方式记录异常?

如何使此调用以递归方式记录异常?
EN

Stack Overflow用户
提问于 2012-05-24 12:33:55
回答 6查看 2.4K关注 0票数 3

我有以下代码:

代码语言:javascript
运行
复制
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

有没有什么方法可以递归地做这件事,或者将消息格式放在另一个函数中并调用它会更好?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-05-24 12:53:00

这就是我要做的:

代码语言:javascript
运行
复制
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();
}
票数 2
EN

Stack Overflow用户

发布于 2016-06-22 23:22:16

我知道这是一个古老的问题,而且已经有了一个标记的答案。然而,这就是我如何做到这一点,我将在这里发布这篇文章,以防它对某人有帮助:

代码语言:javascript
运行
复制
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;
    }
}

与前面的答案略有不同的是,使用了扩展方法。这样一来,我们可以简单地将其称为:

代码语言:javascript
运行
复制
try 
{
    SomeOperationWhichMayThrow();
}
catch(Exception ex) 
{
    LogError(ex.GetFullTrace());
}

我有一个项目,其中包含许多可重用的实用程序和扩展方法,我在大多数项目中都包含了这些工具和扩展方法。ExceptionExtension就是这些工具中的一个。

为了获得更好的性能,请考虑改用StringBuilder

票数 4
EN

Stack Overflow用户

发布于 2012-05-24 12:40:07

试着使用像这样的东西

代码语言:javascript
运行
复制
Exception ex = e;
while (ex != null)
{
   string s = ex.Message;
   ex = ex.InnerException;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10731206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档