ABP官方文档翻译 6.1.3 异常处理

时间:2021-11-23 02:22:58

处理异常

  • 介绍
  • 启用错误处理
  • Non-Ajax请求
    • 显示异常
    • UserFriendlyException
    • Error模型
  • AJAX请求
  • 异常事件

介绍

  此文档是与ASP.NET MVC和Web API相关的。如果你对ASP.NET Core感兴趣,参见ASP.NET Core文档。

  在web应用中,异常通常在MVC Controller actions和Web API Controller actions中处理。当异常发生时,应用程序的用户以某种方式被告知错误的相关信息及原因。

  如果错误在正常的HTTP请求时发生,将会显示一个异常页。如果在AJAX请求中发生错误,服务器发送错误信息到客户端,然后客户端处理错误并显示给用户。

  在所有的Web请求中处理异常是件乏味且重复的工作。ABP自动化完成异常处理,几乎从不需要显示的处理任何异常。ABP处理所有的异常、记录异常并返回合适、格式化的响应到客户端。在客户端处理这些响应并将错误信息显示给用户。

启用错误处理

  要启用ASP.NET MVC控制器的错误处理 ,ASP.NET MVC 引用必须启用customErrors模型。

<customErrors mode="On" />

  如果你不想在本地计算机处理错误,可以把它设置为'RemoteOnly'。注意,只有ASP.NET MVC控制器需要这样设置,Web API控制器并不需要。

  如果你已经在全局过滤器处理了异常,那么它可能会隐藏异常,ABP的异常处理就可能不会如期望的那样工作。所以,如果需谨慎设置全局异常处理过滤器。

Non-Ajax请求

  如果请求不是AJAX的,将会显示一个错误页。

显示异常

  这里,有一个MVC控制器的action,它抛出了一个随意的异常:

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

  当然,这个异常可能由另一个方法抛出,而这个方法的调用在这个action里。ABP处理这个异常、记录它并显示'Error.cshtml'视图。你可以自定义这个视图来显示错误。一个示例错误视图(在ABP模板中的默认错误视图):

ABP官方文档翻译 6.1.3 异常处理

  ABP对用户隐藏了异常的细节并显示了一个标准(本地化的)的错误信息,除非你显示的抛出一个UserFriendlyException

UserFriendlyException

  UserFriendlyException是一个特殊类型的异常,它直接显示给用户。参见下面的示例:

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

  ABP记录它但这次不隐藏异常:

ABP官方文档翻译 6.1.3 异常处理  

所以,如果你想显示一个特定的错误信息给用户,那就抛出一个UserFriedlyException(或者一个继承自这个类的异常)。

Error模型

  ABP传递一个ErrorViewModel对象作为Error视图的model:

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

  ErrorInfo包含可以显示给用户错误的详细信息。Exception对象即为抛出的异常。如果你想的话,可以检查它并显示额外信息。例如,如果它是一个AbpValidationException,我们可以显示校验错误:

ABP官方文档翻译 6.1.3 异常处理

AJAX请求

  如果MVC action的返回类型时JsonResult(或异步actions为Task<JsonResult>),ABP返回给客户一个基于异常JSON对象。一个错误返回对象的示例:

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

  success:false表明有错误。error对象提供了错误信息和详情。

  当你在客户端使用ABP基础设施来进行AJAX请求,它自动使用message API处理JSON对象并显示错误信息给用户。参见AJAX API了解更多信息。

异常事件

  当ABP处理任何异常时,它会触发AbpHandledExceptionData事件,这个事件可以被注册并被通知(参见eventbus文档了解更多关于Event Bus的信息)。示例:

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

  如果你把这个示例类放到你的应用中(通常放到Web工程),HandleEvent方法会在所有异常发生时被ABP调用。所以,你可以好好的研究并处理这个异常。

返回主目录