为什么Elmah不承认我自己的Exception派生类型?

时间:2012-06-23 11:43:54

标签: asp.net-mvc elmah

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

当我使用下面的代码来表示异常,而不是在我的错误日志中看到“CtsDataException:Error”,正如我所料,我看到,“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);
}

3 个答案:

答案 0 :(得分:5)

我已经做了一些自己的测试,得出的结论是ELMAH并不选择只报告InnerException。如果您查看错误的详细信息,然后单击原始ASP.NET错误页面,您将看到发生的原始黄色屏幕将异常详细信息列为{{1}而不是抛出的主要自定义异常。堆栈跟踪进一步显示了抛出的原始自定义异常。这是ELMAH用于记录错误的信息。

我的测试包括创建一个InnerException类,只执行CustomException继承。然后我简单地打电话给:

Exception

...报告的内容是throw new CustomException("error!", new NullReferenceException()); NullReferenceException仅出现在堆栈跟踪中。

答案 1 :(得分:0)

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

答案 2 :(得分: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);