【问题标题】:Override Elmah logged error message覆盖 Elmah 记录的错误消息
【发布时间】:2014-04-07 04:24:13
【问题描述】:

有什么方法可以覆盖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));
        }
    }
}

【问题讨论】:

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


    【解决方案1】:

    我认为您的问题可能在这里:

        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 将防止异常被记录两次。否则它本质上就是你所做的。

    【讨论】:

    • 刚刚打开我的项目,我没有编写自定义处理程序。如果这不是您的问题,请告诉我,我会在周末尝试复制。
    • return 是个好主意,但ErrorHandleAttribute 也用于设置结果类型(创建一个 JSON 错误对象以返回给用户)
    • 您是否收到了您现在想看到的错误(如此重复但您想要的消息?)
    • 不,不幸的是我仍然收到内部异常消息,并且消息重复
    【解决方案2】:

    我怀疑您需要创建自己的错误日志实现来记录标准属性以外的任何内容。这应该不会太难。

    SqlErrorLog为例,你只需要重写log方法并放入你自己的逻辑来修改Error类包含的内容,然后再调用基础实现。

    使用@Matthew 也说过的内容会阻止您记录异常两次。

    所有源码都是here

    【讨论】:

    • 这不是我希望的解决方案,但我想我别无选择
    猜你喜欢
    • 1970-01-01
    • 2013-08-09
    • 2011-10-05
    • 2019-07-18
    • 2013-06-09
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 2013-07-13
    相关资源
    最近更新 更多