处理异常

介绍

本文档适用于ASP.NET MVC和Web API。如果您对ASP.NET Core感兴趣,请参阅  ASP.NET Core文档。

在Web应用程序中,异常通常在MVC Controller和Web API Controller操作中处理。发生异常时,将通知应用程序用户错误和可选原因。

如果常规HTTP请求中发生错误,则会显示错误页面。如果AJAX请求中发生错误,服务器会将错误信息发送到客户端,然后客户端处理并向用户显示错误信息。

处理所有Web请求中的异常是繁琐的,并且难以保持DRY。ASP.NET Boilerplate可以自动执行此操作。您几乎不需要显式处理异常。ASP.NET Boilerplate处理所有异常,记录它们,并向客户端返回适当的格式化响应。它还在客户端处理这些响应并向用户显示错误消息。

启用错误处理

若要为ASP.NET MVC控制器启用错误处理,必须为ASP.NET MVC应用程序启用customErrors模式。

<customErrors mode="On" />

例如,如果您不想处理本地计算机上的错误,它也可以是“RemoteOnly”。请注意,这仅适用于ASP.NET MVC控制器,而不适用于Web API控制器。

如果您已在全局过滤器中处理异常,则可能会隐藏异常。因此,ABP的异常处理可能无法按预期工作。所以,如果你这样做,请小心谨慎!

非Ajax请求

如果请求不是AJAX,则会显示错误页面。

显示例外情况

想象一下,有一个MVC控制器动作会抛出一个任意异常:

public ActionResult Index()
{
    throw new Exception("A sample exception message...");
}

最有可能的是,此异常将由此操作调用的另一个方法抛出。ASP.NET Boilerplate处理此异常,记录它并显示“Error.cshtml”视图。您可以自定义此视图以显示错误。这是一个示例错误视图(ASP.NET Boilerplate模板中的默认错误视图):

默认错误视图

ASP.NET Boilerplate隐藏了用户的异常细节,并显示了标准(可本地化)的错误消息,除非您显式抛出UserFriendlyException。

UserFriendlyException

UserFriendlyException是一种特殊类型的异常,直接显示给用户。请参阅以下示例代码:

public ActionResult Index()
{
    throw new UserFriendlyException("Ooppps! There is a problem!", "You are trying to see a product that is deleted...");
}

ASP.NET Boilerplate记录它并不隐藏异常:

用户友好的例外

如果要向用户显示特殊的错误消息,只需抛出UserFriendlyException(或从中派生的异常)。

错误模型

ASP.NET Boilerplate将ErrorViewModel对象作为模型传递给Error视图:

public class ErrorViewModel
{
    public AbpErrorInfo ErrorInfo { get; set; }

    public Exception Exception { get; set; }
}

ErrorInfo包含有关可向用户显示的错误的详细信息。Exception对象是抛出的异常。如果需要,您可以查看并显示其他信息。例如,如果它是AbpValidationException,我们可以显示验证错误:

验证错误

AJAX请求

如果MVC操作的返回类型是JsonResult(或异步操作的Task <JsonResult),则ASP.NET Boilerplate会在发生异常时向客户端返回JSON对象。错误的示例返回对象:

{
  "targetUrl": null,
  "result": null,
  "success": false,
  "error": {
    "message": "An internal error occurred during your request!",
    "details": "..."
  },
  "unAuthorizedRequest": false
}

success:false表示存在错误。错误对象提供消息和详细信息。

当您使用ASP.NET Boilerplate的基础结构在客户端发出AJAX请求时,它会自动处理此JSON对象并使用消息API向用户显示错误消息  有关更多信息,请参阅  AJAX API文档。

例外事件

当ASP.NET Boilerplare处理异常时,它会触发AbpHandledExceptionData事件。 有关Event Bus的更多信息,请参阅  eventbus文档)。例:

public class MyExceptionHandler : IEventHandler<AbpHandledExceptionData>, ITransientDependency
{
    public void HandleEvent(AbpHandledExceptionData eventData)
    {
        //TODO: Check eventData.Exception!
    }
}

如果将此示例类放入应用程序(通常是您的Web项目),则将为ASP.NET Boilerplate处理的所有异常调用HandleEvent方法。从那里,您可以详细调查Exception对象。

nidie.com.cn - 用心与你沟通