2

我刚刚实现了 Elmah 来登录我的 MVC3 应用程序,当然一切都很好,除了当我使用信号记录自定义异常时,Elmah 似乎“看到”了我的自定义异常的 InnerException 属性,但不是自定义的异常本身。

当我使用下面的代码发出异常信号时,我没有在错误日志中看到“CtsDataException:错误”,正如我所料,我看到的是“DbEntityValidation:一个或多个实体的验证失败。”,内部异常和它的信息。如果我打开日志项,我会看到我的自定义异常已正确记录,因此看起来“异常描述符”是错误的,而不是实际的日志条目。

我究竟做错了什么?

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());

...并且报告的是NullReferenceExceptionCustomException出现在堆栈跟踪中的 。

于 2012-06-27T13:20:05.960 回答
0

在这种情况下,我的选择理论是 ELMAH 选择显示抛出的异常,而不是用于包装它的异常。如果 ELMAH 有办法在日志中包含一条消息,我认为这种“包装在一个更具描述性但最终不相关的异常中,永远不会抛出”malarkey 可能会结束。

于 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 回答