3

我正在使用以下代码从我的 MVC 模型状态中获取异常:

        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 中?

我的问题是我不确定如何处理可能存在多级异常的事实。

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

    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

4 回答 4

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;
}
于 2012-09-17T14:18:53.583 回答
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;
        }
}
于 2012-09-17T14:31:58.643 回答
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 */
));
于 2012-09-17T14:31:20.090 回答
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();

这会很好地打印出来。

于 2012-09-17T14:26:49.707 回答