如何将我的异常信息放入IEnumerable <string> </string>

时间:2012-09-17 14:12:57

标签: c#

我使用以下代码从MVC Model State中获取异常:

        IEnumerable<string> exceptions = ModelState (x => x.Value.Errors
                .Where(error => (error != null) &&
                                (error.Exception != null) &&
                                (error.Exception.Message != null))
                .Select(error => error.Exception.Message));

对于try-catch块异常我怎么能编写一种方法来获取异常e并使其成为我的异常和内部异常消息也被放入IEnumerable ,就像我上面做的那样? / p>

我的问题是我不知道如何处理可能存在多个异常级别的事实。

不确定这是否有帮助,但这是我之前使用的代码将异常放入字符串中:

    public static string GetFormattedErrorMessage(this Exception e)
    {
        var exError = "";
        if ( 1 == 1) {
            if (e == null)
            {
                throw new ArgumentNullException("e");
            }

            exError = e.Message;
            if (e.InnerException != null)
            {
                exError += "<br>" + e.InnerException.Message;
                exError += "<br>" + e.StackTrace;
                if (e.InnerException.InnerException != null)
                {
                    exError += "<br>" + e.InnerException.InnerException.Message;
                }
            }
        } else {
            exError = "System error";
        }
        return exError;
    }

4 个答案:

答案 0 :(得分:4)

你可以遍历内部例外,例如

public IEnumerable<string> GetErrors(Exception ex)
{
    ...

    var results = new List<string>() { ex.Message };
    var innerEx = ex.InnerException;
    while (innerEx != null) 
    {
        results.Add(innerEx.Message);
        innerEx = innerEx.InnerException;
    }
    return results;
}

答案 1 :(得分:2)

这听起来像递归方法的问题。看看以下内容是否可以帮助您入门。我将由您自行决定是否包含StackTrace并处理AggregateExceptions:

public static IEnumerable<string> FormatExceptionHtml(Exception instance)
{
    if (instance != null)
        yield return instance.Message + "<br />";
    if (instance.InnerException != null)
        foreach (var inner in FormatExceptionHtml(instance.InnerException))
        {
            yield return inner;
        }
}

答案 2 :(得分:1)

看起来唯一的“有趣”位是枚举内部异常。无需手动构建数据结构;一个简单的枚举器应该大大简化问题:

public static IEnumerable<Exception> AsEnumerable(this Exception self)
{
    for (var e = self; e != null; e = e.InnerException) yield return e;
}

foreach (var e in myException.AsEnumerable()) { /* print debug info */ }

// or
var exceptionString = string.Join("<br>", myException.AsEnumerable().Select(e =>
    /* debug info */
));

答案 3 :(得分:0)

使用递归来获得每个级别的异常:

private static string GetFormattedErrorMessage(this Exception ex)
{
    StringBuilder sb = new StringBuilder();
    if (ex != null)
    {
        sb.AppendLine(ex.Message);
        sb.AppendLine(ex.StackTrace);
        sb.AppendLine(ex.InnerException.GetFormattedErrorMessage());
    }
    return sb.ToString();
}

或使用普通

ex.ToString();

哪个会很好地打印出来。