当在一个MVC3 web应用我用使用全局日志
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
应用全局错误处理,其中用户被示出的“错误”视图如果未处理的异常出现调用两次MVC [的HandleError] HandleErrorAttribute。
对于一个特定的视图,我还希望通过装饰方法[HandleError(View = "SpecialError")]
发生未处理的异常时显示不同的错误视图。这工作得很好。
我然后想要添加全局日志记录未处理的异常。我创建了日志代码自定义的HandleError属性:
public class MyHandleErrorAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext context)
{
// Write to log code
base.OnException(context);
}
}
和更新的RegisterGlobalFilters和方法装饰使用这个属性名代替。这一般起作用,但是当用MyHandleError(View = "SpecialError")]
装饰的方法内出现异常时,OnException方法被称为两次。我原先假设用这个属性装饰方法取代了全局处理器,但它似乎只是被添加到(这更有意义,但它不是我想要的)。通过两次调用OnException,同样的异常会被记录两次,这是不会发生的。我不认为OnException被称为两次,因为它是一个自定义属性 - 我相信这也发生在标准的HandleError属性,它现在简单地可见,因为我正在创建它的记录。最终,我想记录所有未处理的异常(一次),同时保留[HandleError]提供的功能,特别是为特定的方法异常设置不同的视图。有没有一种干净的方式来做到这一点?
谢谢!这对我也很有用。 – abjbhat 2013-08-01 06:40:53
嗨,很好的解决方案,但你怎么能从异常的来源,如类/方法的名称获得更多的信息? – Patrick 2014-04-17 11:01:38