Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net MVC控制器层是错误处理的理想场所吗?_Asp.net_Asp.net Mvc - Fatal编程技术网

Asp.net MVC控制器层是错误处理的理想场所吗?

Asp.net MVC控制器层是错误处理的理想场所吗?,asp.net,asp.net-mvc,Asp.net,Asp.net Mvc,在我看来是这样的,因为几乎所有抛出到控制器的路由请求下游的异常都将抛出到控制器或控制器下游的某个地方。除了视图之外,控制器上游没有任何东西,视图只是控制器中发生的情况的表示。控制器操作是大多数错误处理的理想场所,但不是所有错误处理的理想场所 直到控制器操作完成执行后,才会呈现视图。因此,例如,如果您向视图传递一个viewmodel,它不仅仅是一个简单的数据容器,而且在呈现视图时会引发异常,这种情况并不少见。您无法在控制器操作中捕捉到这一点 这里有一个工具可以用来捕获控制器外部的异常 控制器操作是

在我看来是这样的,因为几乎所有抛出到控制器的路由请求下游的异常都将抛出到控制器或控制器下游的某个地方。除了视图之外,控制器上游没有任何东西,视图只是控制器中发生的情况的表示。

控制器操作是大多数错误处理的理想场所,但不是所有错误处理的理想场所

直到控制器操作完成执行后,才会呈现视图。因此,例如,如果您向视图传递一个viewmodel,它不仅仅是一个简单的数据容器,而且在呈现视图时会引发异常,这种情况并不少见。您无法在控制器操作中捕捉到这一点

这里有一个工具可以用来捕获控制器外部的异常

控制器操作是大多数错误处理的理想场所,但不是所有错误处理的理想场所

直到控制器操作完成执行后,才会呈现视图。因此,例如,如果您向视图传递一个viewmodel,它不仅仅是一个简单的数据容器,而且在呈现视图时会引发异常,这种情况并不少见。您无法在控制器操作中捕捉到这一点

这里有一个工具可以用来捕获控制器外部的异常

通常由需要显示的视图的控制器决定,以便在较低级别(例如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;
        }
    }
}

它通常由控制器决定,您需要显示哪个视图,以便在较低级别(例如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;
        }
    }
}

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

模型必须是进行验证的最合适场所。理想情况下,模型必须是域模型应该位于的位置。。因此,这使它成为进行错误验证的理想场所。这取决于异常和您的操作。例如,如果您正在保存一个可能正在破坏的实体 一些业务规则,则您的BLL会抛出异常,例如BusinessRuleXXException,以发出此信号 不遵守情况。在这种情况下,您必须处理该异常控制器是执行此操作的好地方,并向用户显示适当的消息,指示 怎么了,你不能保存这个,因为布拉布拉

另一方面,您可能在wich中有一个bug应用程序 您正在执行某些操作,并且引发了一个错误,例如PK约束被违反,或者可能是外部错误 服务不可用或任何其他不期望出现的情况表示应用程序中真正的异常。对于这种 对于错误,我的建议是通过使用HandleError筛选器或处理错误的自定义筛选器来全局处理它们 并记录它们,并将用户重定向到一个错误页面,其中显示友好的抱歉,出了问题。一队训练有素的猴子已经被派去处理这种情况,如图所示


注意。

这取决于异常和您的操作。例如,如果您正在保存一个可能正在破坏的实体 一些业务规则,则您的BLL会抛出异常,例如BusinessRuleXXException,以发出此信号 不遵守情况。在这种情况下,您必须处理该异常控制器是执行此操作的好地方,并向用户显示适当的消息,指示 怎么了,你不能保存这个,因为布拉布拉

另一方面,您可能在wich中有一个bug应用程序 您正在执行某些操作,并且引发了一个错误,例如PK约束被违反,或者可能是外部错误 服务不可用或任何其他不期望出现的情况表示应用程序中真正的异常。对于这种 对于错误,我的建议是通过使用HandleError筛选器或处理错误的自定义筛选器来全局处理它们 并记录它们,并将用户重定向到一个错误页面,其中显示友好的抱歉,出了问题。一队训练有素的猴子已经被派去处理这种情况,如图所示


关于。

但是如果视图中有错误怎么办?@ajay-那么你做错了。您不应该在仅“显示”数据的内容上遇到HTTP 500。所有逻辑、数据连接、模型绑定等都应该发生在控制器/模型中,而不是在视图中。@Tommy不是真的,当然视图只是显示数据,但要做到这一点,它可以访问模型,通常这不仅仅是一个简单的数据容器,因此它可能会引发异常。因此,不要假设渲染视图不会抛出e
“例外情况”。@Mendelt,我们使用的是强类型视图,所以如果视图和模型之间存在任何问题,我们真的应该在开发和测试期间对它们进行整理。我不是说视图和模型之间的问题。我在谈论模型内部的问题。如果您的模型不仅仅是一个简单的数据容器,那么它可以在视图读取属性或调用方法时引发异常。我见过的一个例子是Linq在惰性加载对象时抛出的异常。假设您有一个包含项目的ShoppingCart类,枚举项目以显示它们是典型的视图逻辑。但是这可能会导致模型执行数据库调用,这可能会中断,并且在操作方法之外呈现视图时会中断。但是如果视图中有错误怎么办?@ajay-那么您的操作是错误的。您不应该在仅“显示”数据的内容上遇到HTTP 500。所有逻辑、数据连接、模型绑定等都应该发生在控制器/模型中,而不是在视图中。@Tommy不是真的,当然视图只是显示数据,但要做到这一点,它可以访问模型,通常这不仅仅是一个简单的数据容器,因此它可能会引发异常。所以不要假设呈现视图不会引发异常。@Mendelt,我们使用的是强类型视图,所以如果视图和模型之间存在任何问题,我们真的应该在开发和测试期间对它们进行分类。我不是在说视图和模型之间的问题。我在谈论模型内部的问题。如果您的模型不仅仅是一个简单的数据容器,那么它可以在视图读取属性或调用方法时引发异常。我见过的一个例子是Linq在惰性加载对象时抛出的异常。假设您有一个包含项目的ShoppingCart类,枚举项目以显示它们是典型的视图逻辑。但这可能会导致模型执行数据库调用,这可能会中断,并且在操作方法之外呈现视图时会中断。我完全同意这种较低级别的错误处理,只是不同意您这样做。如果某些内容无法保存,为什么返回false?为什么不让异常冒泡?@ProfK:你确实可以让它冒泡,以上只是你可以做的许多方法的一个例子:就个人而言……我总是让异常冒泡,因为你想知道它为什么从来没有保存过,我完全同意这种低级错误处理方式,只是不同意你这样做。如果某些内容无法保存,为什么返回false?为什么不让异常冒泡呢?@ProfK:你确实可以让它冒泡,以上只是你可以做的许多方法的一个例子:就个人而言……我总是让异常冒泡,因为你想知道它为什么从来没有保存过,甚至在视图中输出它。为模型干杯。管制员应该精干而中庸。模特应该是胖的。实际上,我将验证和数据访问划分为服务和存储库层。但是-这是模型验证的良好开端,为模型干杯。管制员应该精干而中庸。模特应该是胖的。实际上,我将验证和数据访问划分为服务和存储库层。但是-这是模型验证的一个良好开端,