有没有办法覆盖Elmah
记录的错误消息而不重复它?
我有一个自定义异常类:
public class BusinessException : Exception
{
// detailed error message used for logging / debugging
public string InternalErrorMessage { get; set; }
public BusinessException(string message, string internalMessage)
:base(message)
{
InternalErrorMessage = internalMessage;
}
}
从代码中,我抛出了这样的异常:
string detailedErrorMessage = string.Format("User {0} does not have permissions to access CreateProduct resource", User.Identity.Name);
throw new BusinessException("Permission denied", detailedErrorMessage);
当Elmah记录错误时,它只记录Permission denied
消息。但是,我需要记录异常的InternalErrorMessage
属性。
我尝试创建自定义HandleErrorAttribute
来执行此操作,但这会重复记录的异常:
public class ErrorHandleAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
if (filterContext.ExceptionHandled == true)
return;
Exception exception = filterContext.Exception;
BusinessException businessException = exception as BusinessException;
if (businessException != null)
{
ErrorSignal.FromCurrentContext().Raise(new Exception(businessException.InternalErrorMessage, exception));
}
}
}
答案 0 :(得分:2)
我认为您的问题可能就在这里:
if (businessException != null) {
ErrorSignal.FromCurrentContext().Raise(
new Exception(businessException.InternalErrorMessage, exception));
}
当你创建一个新的异常而不是这样的东西时:
if (businessException != null) {
ErrorSignal.FromCurrentContext().Raise(businessException));
}
我已经完成了我的某个网站的代码,并且可以看看我是否可以在今天晚些时候重新创建您的问题(假设这不起作用)。我认为这是帮助我实施的SO帖子:How to get ELMAH to work with ASP.NET MVC [HandleError] attribute?
修改强>
重新阅读你的问题和另一个答案我意识到我试图解决你的尝试纠正而不是实际的问题。您是否尝试过类似this solution的内容,这与您当前的尝试略有偏差:
public override void OnException(ExceptionContext filterContext) {
if (filterContext.ExceptionHandled == true) {
return;
}
Exception exception = filterContext.Exception;
BusinessException businessException = exception as BusinessException;
if (businessException != null) {
var customEx = new Exception(
businessException.InternalErrorMessage, new BusinessException());
ErrorSignal.FromCurrentContext().Raise(customEx);
return;
}
}
检查InternalErrormessage
是否正在返回您期望的内容,我希望强制return
此处可以防止异常被记录两次。否则它基本上就是你所做的。
答案 1 :(得分:0)
我怀疑您需要创建自己的错误日志实现来记录标准属性以外的任何内容。这应该不会太困难。
以SqlErrorLog
为例,您只需覆盖日志方法&在调用基本实现之前,用你自己的逻辑修改Error
类包含的内容。
使用@Matthew所说的内容将阻止你两次记录异常。
所有源代码均为here