覆盖Elmah记录的错误消息

时间:2014-03-05 08:22:46

标签: asp.net asp.net-mvc error-handling elmah

有没有办法覆盖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));
        }
    }
}

enter image description here

2 个答案:

答案 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