代码之家  ›  专栏  ›  技术社区  ›  Mr AH

C使用属性处理MVC中的异常

  •  1
  • Mr AH  · 技术社区  · 14 年前

    我想处理由带有错误视图模型和错误视图的任何控制器操作引发的异常。我们的想法是:

    [InformClientOfExceptions(typeof(MyErrorHandler))]
    public ActionResult MyAction(Int32 someId)
    {
        //...code
    }
    

    然后可能有一些类MyErrorHandler,它实现了一个新的接口IErrorView:

    public class MyErrorHander : IErrorView
    {
        public ActionResult OnException(Exception ex)
        {
            //..code which converts exception to some error view model and returns the view
    

    当操作引发异常时,该属性将调用指定的类并将异常传递给它,然后处理该异常(在基本情况下格式化并输出)。现在是的,异常应该永远不会发生,或者至少应该得到正确的处理,但是我希望有一种更好的方式来编写它。我不希望使用自定义错误页,因为我希望扩展此模式以允许对某些类型的异常作出更复杂的响应。有什么好办法吗?

    4 回复  |  直到 11 年前
        1
  •  1
  •   Matt Briggs    14 年前

    [HandleError] 将查找 Error 默认情况下查看。您可以指定视图,并通过带参数的异常进行限制。

    [HandleError(ExceptionType = typeof(ArgumentException), View = "ErrorViewForThatException"]
    

    您可以将该属性放在操作类或控制器类上。它并不完全符合你的要求,但它非常接近。

        2
  •  0
  •   hunter    14 年前

    你试过吗? [HandleError] ?

        3
  •  0
  •   Brian Mains    14 年前

    创建从filterattribute继承并实现iexceptionfilter属性的类(类似这样)。此组合用于记录异常,您可以采用指定的对象类型来记录异常。

        4
  •  0
  •   Chris Marisic    14 年前

    除了使用默认情况下包含在MVC中的构造,如 [HandleError] 您实际讨论的方法是面向方面编程(AOP)。要实现与此类似的AOP解决方案,您需要使用一个构建后的编织框架,该框架将合并到代码中,以实现您想要的结果,如postsharp或linfu.aop。要在没有构建编织框架的情况下实现这一点,您需要通过接口和使用动态代理(如castle.dynamicproxy或linfu.dynamicproxy)来处理它。