如何将自己的数据添加到MVC中的Exception?

时间:2010-08-18 16:15:11

标签: asp.net-mvc exception-handling

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的地方,但是如何根据它来自哪个控制器来创建正确的类型?

1 个答案:

答案 0 :(得分:1)

如果要向记录的消息添加其他信息,请创建自定义例外,并为要收集的信息添加其他属性。一些记录器记录ToString()方法返回调用,或只记录消息,所以我不知道ELMAH做了什么。很可能是ToString(),所以如果在异常中重写ToSTring()以在那里添加附加信息,那么应该将其添加到记录的消息中。