如何使用额外的Data属性将自定义异常记录到Elmah?

时间:2014-10-01 15:44:23

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

我有一个自定义异常,我使用如下所示的反射覆盖Data属性...

public class MyCustomException : Exception
{
    private readonly SomeModel _log;
    public MyCustomException(SomeModel log)
        : base(string.Format("Could not insert to some table"))
    {
        _log = log;
    }

    public override System.Collections.IDictionary Data
    {
        get
        {
            var data = new Dictionary<string, object>();
            foreach (PropertyInfo pinfo in _log.GetType().GetProperties())
            {
                data.Add(pinfo.Name, pinfo.GetType().GetProperty(pinfo.Name));
            }
            return data;
        }
    }
}

当抛出上述异常时,它会被记录到elmah,但不会记录Data

我必须做出哪些更改才能将Data记录到elmah?请指教。

3 个答案:

答案 0 :(得分:1)

Detail对象的Elmah.Error属性 - 然后由ErrorLog类处理 - 是根据异常的ToString()方法构建的。

// Elmah.Error
public Error(Exception e, HttpContext context)
{
    // snip
    this._detail = e.ToString(); // here
    // snip

将您的数据添加到MyCustomException中的ToString方法的覆盖中,以便在Elmah中查看。

答案 1 :(得分:1)

您的问题目前是ELMAH问题跟踪器上大多数明星的问题:

https://code.google.com/p/elmah/issues/detail?id=162

答案 2 :(得分:1)

@samy可能更正确,但我还找到了另一种可能适用于我的情况的选项。我在一个webapi2项目中使用elmah,用户是匿名的,在一个特定的控制器中我想从viewmodel记录一些请求的上下文(在我的例子中,一个电子邮件地址,但我可能记录更多的数据),我想成为能够将错误与电子邮件关联,以便我可以在错误之后确定同一用户是否能够成功提交订单。

在我的控制器中,我在一个事务中执行了一些数据库调用,然后向trypal提交了一个命令,所有这些都在try / catch块中。在catch中,我使用包含电子邮件的消息创建一个新的异常实例,并将innerException属性设置为抛出的异常并抛出新的异常。

我知道丢失一些堆栈跟踪信息是可能的,我在上下文中对此进行了测试,并且堆栈跟踪似乎得到了维护,但控制器内部发生异常,因为此特定控制器和应用程序的层数不多。如果有人有类似情况,这种方法可能是最快捷,最简单的方法。

catch (Exception ex)
{
    Exception newException = new Exception(viewModel.ContactEmail, ex);
    throw newException;
}

这假设您有一个例外过滤器,例如下面(对于webapi),并且过滤器在global.asax中注册为全局。

public class LogExceptionAttribute : ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext actionExecutedContext)
    {
        if (HttpContext.Current != null)
        {
            ErrorSignal.FromCurrentContext().Raise(actionExecutedContext.Exception);
        }
    }
}
相关问题