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 に答える