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

时间:2010-02-12 16:44:15

标签: c# asp.net asp.net-mvc attributes

我想处理任何带有ErrorView模型和错误视图的控​​制器操作引发的异常。这个想法是有类似的东西:

[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 个答案:

答案 0 :(得分:1)

默认情况下,

[HandleError]会查找Error视图。您可以指定视图,并使用参数

按例外进行限制
[HandleError(ExceptionType = typeof(ArgumentException), View = "ErrorViewForThatException"]

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

答案 1 :(得分:0)

你试过[HandleError]吗?

答案 2 :(得分:0)

创建一个继承自FilterAttribute的类,并实现IExceptionFilter属性(类似的东西)。此组合用于记录异常,您可以按照指定的方式接收用于记录异常的对象类型。

答案 3 :(得分:0)

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