📅  最后修改于: 2020-10-21 04:54:02             🧑  作者: Mango
在ASP.NET中,错误处理是使用标准的try catch方法或应用程序事件完成的。 ASP.NET MVC附带使用称为异常过滤器的功能对异常处理的内置支持。我们将在这里学习两种方法:一种方法是重写onException方法,另一种方法是定义HandleError过滤器。
当我们要在控制器级别处理Action方法中的所有异常时,可以使用这种方法。
要了解这种方法,请创建一个MVC应用程序(遵循前面各章中介绍的步骤)。现在添加一个新的Controller类,并添加以下代码,该代码将覆盖onException方法并在我们的Action方法中显式引发错误-
现在让我们创建一个名为Error的通用视图,当应用程序中发生任何异常时,该视图将显示给用户。在“视图”文件夹中,创建一个名为“共享”的新文件夹,并添加一个名为“错误”的新视图。
将以下代码复制到新创建的Error.cshtml中-
如果尝试立即运行该应用程序,它将得到以下结果。当此控制器内的任何操作方法中发生任何异常时,以上代码将呈现“错误视图”。
这种方法的优点是同一控制器内的多个动作可以共享此错误处理逻辑。但是,缺点是我们不能在多个控制器之间使用相同的错误处理逻辑。
HandleError属性是我们在“过滤器”和“动作过滤器”一章中研究的动作过滤器之一。 HandleErrorAttribute是IExceptionFilter的默认实现。该过滤器处理控制器动作,过滤器和视图引发的所有异常。
要使用此功能,首先打开web.config中的customErrors部分。打开web.config并将以下代码放入system.web内,并将其值设置为On。
我们已经在视图下的共享文件夹内创建了错误视图。这次将此View文件的代码更改为以下代码,以使用HandleErrorInfo模型(在System.Web.MVC下提供)强烈键入它。
@model System.Web.Mvc.HandleErrorInfo
@{
Layout = null;
}
Error
Sorry, an error occurred while processing your request.
Exception details
Controller: @Model.ControllerName
Action: @Model.ActionName
Exception: @Model.Exception
现在,将以下代码放入您的控制器文件中,该文件在控制器文件中指定[HandleError]属性。
using System;
using System.Data.Common;
using System.Web.Mvc;
namespace ExceptionHandlingMVC.Controllers {
[HandleError]
public class ExceptionHandlingController : Controller {
public ActionResult TestMethod() {
throw new Exception("Test Exception");
return View();
}
}
}
如果尝试立即运行该应用程序,将收到类似于以下屏幕截图所示的错误。
如您所见,这次错误包含有关Controller和Action相关详细信息的更多信息。以这种方式,可以在任何级别和跨控制器使用HandleError来处理此类错误。