Will的错误处理post真棒!我还没有使用ELMAH,但我想开始在每个控制器的基础上将一些自己的数据添加到Exception中。现在,我有一个基本控制器覆盖所有项目控制器继承的Will OnException(ExceptionContext)
。
我想我明白我需要在每个Controller上自定义另一个OnException
覆盖,但是如何将数据传递给该异常?我需要的数据可能并不总是单个文本值。
Exception(string)
例外并以某种方式在覆盖中访问它们?修改
这可能听起来很愚蠢,但有没有办法处理未处理的错误并仍然提取这些信息?如果没有,我能看到的唯一解决方案是在每个Controller方法的开头创建自定义的Exception实例,以便远程可能需要它。这是唯一的方法吗?
另一个编辑
Per Lost In Tangent's帖子(和第2部分),我修改了这个CustomFactory类,并在Global.asax中注册了它。他对base.requestContext的帖子中的引用无效。
public class CustomFactory : DefaultControllerFactory
{
protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
{
var controller = (Controller)base.GetControllerInstance(requestContext, controllerType);
controller.ActionInvoker =
new CustomControllerActionInvoker(new ControllerContext(requestContext, controller));
return controller;
}
}
然后在我的CustomControllerActionInvoker类中,我重写了InvokeAction:
public override bool InvokeAction(ControllerContext controllerContext, string actionName)
{
try
{
return base.InvokeAction(controllerContext, actionName);
}
catch (Exception)
{
throw;
}
}
我认为catch块是Brian建议我创建ViewResult的地方,但是如何根据它来自哪个控制器来创建正确的类型?
答案 0 :(得分:1)
如果要向记录的消息添加其他信息,请创建自定义例外,并为要收集的信息添加其他属性。一些记录器记录ToString()方法返回调用,或只记录消息,所以我不知道ELMAH做了什么。很可能是ToString(),所以如果在异常中重写ToSTring()以在那里添加附加信息,那么应该将其添加到记录的消息中。