MVC控制器层是错误处理的理想位置吗?

时间:2010-08-03 11:41:55

标签: asp.net asp.net-mvc

对我来说似乎是这样,因为几乎所有向控制器发出任何路径请求的下游抛出的异常都将被抛出控制器或控制器的下游。除了视图之外,控制器上游没有任何内容,这只是控制器中发生的事情的演示。

4 个答案:

答案 0 :(得分:2)

控制器操作是大多数错误处理的理想位置,但不是全部。

直到控制器操作完成后才会呈现视图。因此,例如,如果您向视图传递一个不仅仅是一个简单数据容器的viewmodel,它会在呈现视图时抛出异常(不是一个不常见的场景)。您无法在控制器操作中捕获此信息。

这是一个可用于捕获控制器外部异常的工具 http://www.hanselman.com/blog/ELMAHErrorLoggingModulesAndHandlersForASPNETAndMVCToo.aspx

答案 1 :(得分:1)

通常由控制器确定您需要显示的视图,以便在较低级别发生错误,例如BLL / DAL仍然可以进行错误处理,并且可以由控制器辅助,例如

public ActionResult DisplayObject(int id)
{
    // high level error handling
    using (MyRepo repo = new MyRepo()) 
    {
        var obj = repo.GetObj(id);
        if (obj == null)
            return View("ErrorDisplayingObject");
        else
            return View("ObjectDetails");
    }
}
...

public ActionResult SaveObject(int id, string param1, string param2)
{
    // high level error handling
    using (MyRepo repo = new MyRepo()) 
    {
        var obj = repo.GetObj(id);
        if (obj != null)
        {
            obj1.Param1 = param1;
            obj2.Param2 = param2;
            if (repo.Save())
                return View("SaveConfirmation");
        }          
    }
    return View("ErrorSavingObject");
}

...
public class MyRepo
{
    public MyObject GetObj(int id)
    {
        // low level error handling
        try
        {
            // retrieve object

        }
        catch (Exception)
        {
             return null;
        }
    }

    public bool Save()
    {
        // low level error handling
        try
        {
            // save data
            return true;
        }
        catch (Exception)
        {
            return false;
        }
    }
}

答案 2 :(得分:1)

模型必须是您可以进行验证的最合适的地方。理想情况下,模型必须是域模型所在的位置..因此,这使得它成为进行错误验证的理想场所

答案 3 :(得分:1)

这取决于异常以及您的操作的作用。例如,如果您正在保存可能正在破坏的实体 一些业务规则,然后预计你的BLL抛出异常(例如BusinessRuleXXException)来发出信号 违规情况。在这种情况下,您必须处理该异常(Controller是执行此操作的好地方)并向用户显示指示的相应消息 出了什么问题(你不能保存这个因为bla bla ...)。

另一方面,你可能有一个错误的应用程序 您正在执行某些操作并引发错误,例如违反PK约束或可能是外部错误 服务不可用或任何其他不期望的情况代表您的应用程序中的实际例外。对于这种 我的建议是使用HandleError过滤器或处理错误的自定义过滤器来全局处理它们 并记录它们,并将用户重定向到一个错误的页面,其中友好的“抱歉,出现了问题。已经派遣一队训练有素的猴子来处理这种情况”的消息。

问候。