<<ABP文档>> 异常处理

文档目录

本节内容:

  • 简介
  • 启用错误处理
  • 非AJAX请求
    • 显示异常
    • UserFriendlyException
    • Error 模型
  • AJAX 请求
  • 异常事件

简介

这个方法针对Asp.net Mvc和Web Api,如果你对Asp.net Core感兴趣,请看Asp.net Core文档。

在一个Web应用里,异常通常在Mvc控制器的Action或Web Api 控制器的Action里被处理,当一个异常姓时,应用的用户会通过某种方式收到错误信息和错误的可能原因。

如果一个错误发生在平常的HTTP请求里,会显示一个页面错误,如果一个错误发生在一个AJAX请求里,服务端把错误发给客户端,客户端负责处理和显示给用户。

在所有Web请求里,处理异常是一件乏味且重复的事情,ABP自动化了这一过程,你几乎不用显式处理任何异常,ABP处理所有异常、日志记录它们并返回对应的格式化的响应给客户端,同时在客户端处理这个响应并显示错误信息给用户。

启用错误处理

要启用ABP控制器的错误处理,customErrors的mode必须启用:

<customErrors mode="On" />

如果你不想在本地计算上处理错误,可以把它设置为“RemoteOnly”。

注意:只需要为Asp.net Mvc控制器设置这个,Web Api 和 Asp.net Core 的控制器不需要设置。

非Ajax请求

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

显示异常

此处,有一个Mvc控制器的Action抛出一个任意的异常:

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

当然,这个异常也会被调用这个Action的另一个方法抛出,ABP处理这个异常、日志记录它并显示“Error.cshtml”视图,你可以自定义这个视图来显示错误,一个错误视图的示例(在ABP模板里默认的Error视图):

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日志记录它但这次不隐藏异常:

所以,如果你想显示一个特殊的错误信息给用户,只要抛出一个UserFriendlyException(或继承于它的一个异常)。

Error 模型

ABP传递一个ErrorViewModel对象作为模型给Error视图:

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

    public Exception Exception { get; set; }
}

ErrorInfo包含能显示给用户的错误细节信息,Exception对象就是抛出的异常,你可以核实它并显示额外的信息,例如,如果它是一个AbpValidationException,你可以显示验证错误信息:

AJAX 请求

如果Mvc的Action返回类型是JsonResult(或异步Action的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对象提供了错误message(信息)和details(明细)。

当你使用ABP基础架构在客户端发送AJAX请求,它自动处理这个JSON对象,并使用message API显示错误信息给用户,更多信息查看AJAX Api。

异常事件

当ABP处理任何异常时,它会触发一个AbpHandledExceptionData事件,它可被注册后通知并发出通知(查看事件总线文档获取更多信息),例如:

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

如果你把这个示例类加入到你的应用(通常是Web应用),当ABP处理异常时,HandleEvent方法将被调用,所以,你可以深入的检查这个异常处理。

kid1412附:英文原文:http://www.aspnetboilerplate.com/Pages/Documents/Handling-Exceptions

时间: 2024-12-26 09:02:52

<<ABP文档>> 异常处理的相关文章

&lt;&lt;ABP文档&gt;&gt; Mvc 控制器

文档目录 本节内容: 简介 AbpController基类 本地化 其它 过滤 异常处理和结果包装 审计日志 验证 授权 工作单元 反伪造 模型绑定器 简介 ABP通过nuget包Abp.Web.Mvc集成到Asp.net Mvc 控制器.你可以像往常那样创建普通的Mvc控制器,依赖注入可以对普通的Mvc控制器起作用,但你应当使你的控制继承自AbpController,它提供了许多好处和更好的集成到ABP. AbpController基类 这是一个简单的继承自AbpController的控制器:

&lt;&lt;ABP文档&gt;&gt; Web Api 控制器

文档目录 本节内容: 简介 AbpApiController 基类 本地化 其它 过滤 审计日志 授权 防伪造过滤 工作单元 结果包装和异常处理 结果缓存 验证 模块绑定器 简介 通过Abp.Web.Api的nuget包,把ABP集成到Asp.net Web Api 控制器里.你可以像之前做的一样创建平常的Asp.net Web Api控制器,依赖注入会很好地为这些平常的ApiController工作,但你要把你的控制器继承于AbpApiController,它提供了许多好处和更好地集成到ABP

ABP文档 - 对象与对象之间的映射

文档目录 本节内容: 简介 IObjectMapper 接口 集成 AutoMapper 安装 创建映射 自动映射的特性 自定义映射 扩展方法 MapTo 单元测试 预定义的映射 LocalizableString -> string 注入 IMapper 简介 把一个对象映射到另一个相似的对象很常见,两个对象(类)具有相似或相同的属性,它们之间要互相映射,其实这项工作重复且无聊,考虑一个典型的应用服务方法,如下: public class UserAppService : Applicatio

&lt;&lt;ABP文档&gt;&gt; 通知系统

文档目录 本节内容: 简介 发送模式 通知类型 通知数据 通知重要性 关于通知持久化 订阅通知 发布通知 用户通知管理器 实时通知 客户端 通知存储 通知定义 简介 通知用来告知用户系统里特定的事件发生了,ABP提供一个发布/订阅,它基于实时通知基础框架. 发送模式 有两种方式可以发送通知给用户: 用户订阅一个特定的通知类型,然后我们发布一个此类型的通知,它会分发给所有订阅的用户,这就是发布/订阅模式. 我们可以直接发送一个通知给目标用户(users). 通知类型 有两种通知类型: 一般通知:任

&lt;&lt;ABP文档&gt;&gt; 嵌入的资源文件

文档目录 本节内容: 简介 创建嵌入的文件 暴露嵌入的文件 使用嵌入的文件 简介 一个web应用里,客户端包含javascript,css,xml等文件,这此文件被添加到一个web项目后,发布成独立的文件,有时,我们需要把一些这样的文件打包入一个程序集(一个类库项目,一个Dll文件),并且作为嵌入式资源文件部署在这个程序集里,ABP提供了一个基础架构,方便地处理这件事. 创建嵌入的文件 我们首先要创建一个资源文件并把它标记为嵌入式资源,任何程序集都可以包含嵌入式资源文件,假设我们有一个名为“Ab

&lt;&lt;ABP文档&gt;&gt; 审计日志

文档目录 本节内容: 简介 关于 IAuditingStore 配置 通过特性启用/禁用 注意 简介 维基百科:“一个审计追踪(也叫审计日志)是一个安全相关的时序记录.记录组.和/或记录源和目标,作为任何时候一个特殊操作带来影响的一序列活动的书面文件”. ABP提供一个基础框架来自动记录所有与应用的交互,它能记录有意的方法调用和调用者信息与参数. 基本上,保存的字段有:相关的租户id,调用者id,被调用的服务名(被调用方法的类名),被调用的方法名,执行参数(序列化成Json),执行时间,执行时长

&lt;&lt;ABP文档 - 框架&gt;&gt; 1.4 启动配置

文档目录 本节内容: 配置ABP 替换内置服务 配置模块 为一个模块创建配置 ABP在启动时,提供基础框架和模型来配置和模块化. 配置ABP 在预初始化事件中进行配置,示例: public class SimpleTaskSystemModule : AbpModule { public override void PreInitialize() { //为你的应用添加语言 Configuration.Localization.Languages.Add(new LanguageInfo("en

&lt;&lt;ABP文档 - 框架&gt;&gt; 1.5 多租户

文档目录 本节内容: 什么是多租户 多部署 - 多数据库 单部署 - 多数据库 单部署 - 单数据库 单部署 - 混数据库 多部署 - 单/多/混 数据库 ABP中的多租户 启用多租户 宿主与租户 会话 数据过滤 IMustHaveTenant 接口 IMayHaveTenant 接口 补充提醒 在宿主与租户间切换 什么是多租户 维基百科:“软件多租户是一个软件架构,软件只有一个实例运行在服务器,并服务于多个租户.一个租户包含一组用户,他们拥有指定权限,共同访问一个软件实例.一个多租户架构,应用

&lt;&lt;ABP文档 - 框架&gt;&gt; 1.3 模块系统

文档目录 本节内容: 简介 模块定义 生命周期方法 PreInitialize(预初始化) Initialize(初始化) PostInitialize(提交初始化) Shutdown(关闭) 模块依赖 插件模块 Asp.net Core Asp.net Mvc,Web Api 插件中的控制器 附加程序集 自定义模块方法 模块配置 模块生命期 简介 ABP为创建模块及组织它们提供基础框架.一个模块可依赖于另一个模块.通常地,一个程序集做为一个模块.如果你的应用是多个程序集,建议为每个程序集定义一