我刚刚实现了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);
}
答案 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);