代码之家  ›  专栏  ›  技术社区  ›  David Fox

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

  •  1
  • David Fox  · 技术社区  · 14 年前

    威尔的错误处理 post 真棒!我还没有使用elmah,但是我想开始在每个控制器的基础上向异常添加一些我自己的数据。现在,我有一个基控制器覆盖 OnException(ExceptionContext) 按照所有项目控制器继承的遗嘱。

    我想我知道我需要定制另一个 OnException 在每个控制器上重写,但如何将数据传递到该异常中?我需要的数据不一定总是单个文本值。

    • 我应该抛出自定义异常吗?
    • 我应该扔通用的吗 Exception(string) 异常并在重写中以某种方式访问它们?

    编辑

    这听起来可能很愚蠢,但是否有任何方法可以处理未处理的错误并仍然挖掘这些信息?如果不是这样,我能看到的唯一解决方案就是在每个控制器方法的开头创建自定义异常实例,因为远程可能需要它。这是唯一的方法吗?

    另一个编辑

    Lost In Tangent's post(和第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 回复  |  直到 14 年前
        1
  •  1
  •   Brian Mains    14 年前

    如果要向记录的消息添加其他信息,请创建自定义异常并为要收集的信息添加其他属性。有些记录器记录toString()方法返回调用,或者只记录消息,所以我不知道elmah做了什么。最有可能是do tostring(),因此,如果在异常中重写tostring()以在其中添加附加信息,那么应该将其添加到记录的消息中。