2

MVC3 アプリにログインするために Elmah を実装しましたが、もちろんすべて問題ありませんが、シグナリングを使用してカスタム例外をログに記録する場合、Elmah はカスタム例外の InnerException プロパティを「参照」しているように見えますが、カスタム例外は表示されません。例外そのもの。

以下のコードを使用して例外を通知すると、エラー ログに「CtsDataException: エラー」と表示されるのではなく、予想どおり、「DbEntityValidation: Validation failed for one or more entities.」と表示され、内部例外とそのメッセージ。ログ項目を開くと、カスタム例外が正しくログに記録されていることがわかります。そのため、実際のログ エントリではなく、「例外記述子」が間違っているように見えます。

私は何を間違っていますか?

PS、私のカスタム例外は次のとおりです。

public class CtsDataException: Exception
{
    public CtsDataException(string message, Exception innerException): base(message, innerException)
    {
        ValidationResults = new List<CtsDbValidationResult>();
        var vex = innerException as DbEntityValidationException;
        if (vex != null)
        {
            ValidationResults = vex.EntityValidationErrors.Select(e => new CtsDbValidationResult(e)).ToList();
        }
    }
    public IEnumerable<CtsDbValidationResult> ValidationResults { get; set; }
}

シグナリング コードは次のようになります。

protected void HandleDbEntityValidationException(DbEntityValidationException vex, string message)
{
    var ctsEx = new CtsDataException(message, vex);
    ErrorSignal.FromCurrentContext().Raise(ctsEx);
}

HandleDbEntityValidationException私のベースコントローラーにあります。次のような派生コントローラーで呼び出されます。

catch (DbEntityValidationException vx)
{
    var msg = string.Format("Error updating employee '{0}'", entity.RefNum);
    HandleDbEntityValidationException(vx, msg);
}
4

3 に答える 3

5

私は自分自身でいくつかのテストを行いましたが、ELMAH がInnerException. エラーの詳細を確認し、[元の ASP.NET エラー ページ] をクリックすると、発生した元の黄色い画面に例外の詳細が、InnerExceptionスローされたプライマリ カスタム例外としてではなく、リストされていることがわかります。スタック トレースには、代わりにスローされた元のカスタム例外がさらに表示されます。これは、ELMAH がエラーのログに使用している情報です。

私のテストでは、CustomExceptionから継承するだけのクラスを作成しましたException。次に、単に呼び出しました:

throw new CustomException("error!", new NullReferenceException());

...そして報告されたのは、スタック トレースにのみ表示されるNullReferenceExceptionでした。CustomException

于 2012-06-27T13:20:05.960 に答える
0

このシナリオでの私の選択理論は、ELMAH は、ラップに使用された例外ではなく、スローされた例外を表示することを選択しているというものです。ELMAH にログにメッセージを含める方法があれば、この「より説明的だが最終的にはスローされない無関係な例外にラップする」というマラーキーが終了する可能性があると思います。

于 2012-07-03T06:57:00.790 に答える
0

元の質問に時間通りに実際に答えるのに数年遅れていることに気づきましたが、OPの意図であると私が思うことを達成しようとしている他の人にとって、HangfireのLibLogパッケージで少しスマートに出くわしました(わずかに適応) :

        var _errorType = Type.GetType("Elmah.Error, Elmah");
        dynamic error = Activator.CreateInstance(_errorType, originalException);

        error.Message = "Your custom message";
        error.Type = "Error"; // Or type of original exception or ...
        error.Time = DateTime.Now;

        Elmah.ErrorLog.GetDefault(null).Log(error);
于 2015-10-02T07:42:34.517 に答える