ABP(现代ASP.NET样板开发框架)系列之23、ABP展现层——异常处理
基于DDD的现代ASP.NET开发框架--ABP系列之23、ABP展现层——异常处理
ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称。
ABP的官方网站:http://www.aspnetboilerplate.com
ABP在Github上的开源项目:https://github.com/aspnetboilerplate
在 web 应用程序中,异常通常是在 MVC Controller actions 和 Web API Controller actions 中被处理的。当异常发生时,应用程序用户被以某种方式告知该错误和该错误产生的可选原因(就是列举出产生该异常的多种原因,产生错误的原因可能是列举出的一种也可能是多种。)
如果一个常规的HTTP请求产生错误,那么一个错误页面会展示。如果AJAX请求产生错误,服务器端会发送错误消息到客户端,然后客户端处理并显示该错误给用户。
在所有的Web请求中处理异常是一个单调乏味并且重复性的工作。然而在ABP中,你几乎不需为任何异常的指定明确的异常处理,ABP会自动的记录这些异常并且以适当的格式做出响应返回到客户端。也就是说,在客户端处理这些响应并且将错误详细显示给客户。
开启错误处理
为了开启错误处理, customErrors 必须设置如下:
<customErrors mode="On" />
也可以设置 'RemoteOnly' 如果你不想在本地处理这些错误。
非Ajax请求
如果不是Ajax 请求,那么将会显示一个错误页面。
显示异常(Showing exceptions)
MVC Controller action抛出了一个异常,如下所示:
public ActionResult Index()
{
throw new Exception("A sample exception message...");
}
当然,这个异常能够被指定调用的action中的另外的方法抛出。ABP处理这个异常,记录异常信息并且显示'Error.cshtml' 视图。你能够自定义这个视图来显示该错误。example 错误视图(这个视图是ABP中缺省错误视图模板)。

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 model)
ABP传递一个ErrorViewModel 对象给Error视图:
public class ErrorViewModel
{
public AbpErrorInfo ErrorInfo { get; set; }
public Exception Exception { get; set; }
}
ErrorInfo 包含了能够显示给客户的详细的异常信息。Exception 对象就是那个被抛出的异常。你能够核实异常并且附加自定义信息来显示,如果你想这样做的话。例如:我们能够核实该异常是否是一个AbpValidationException。

AJAX请求
如果请求是一个AJAX请求,ABP会返回一个JSON对象到客户端。ASP.NET MVC Controllers 和 ASP.NET Web API Controllers 也是这么处理的。以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 和dynamic web api layer。
异常事件
当ABP处理任何Web请求的异常时,它会触发AbpHandledExceptionData事件,当然你必须注册该事件,并且写相应的处理代码。详细信息请参照eventbus documentation。
希望更多国内的架构师能关注到ABP这个项目,也许这其中有能帮助到您的地方,也许有您的参与,这个项目可以发展得更好。
欢迎加QQ群:
ABP架构设计交流群:134710707
ABP架构设计交流2群: 579765441
ABP(现代ASP.NET样板开发框架)系列之23、ABP展现层——异常处理的更多相关文章
- ABP(现代ASP.NET样板开发框架)系列之18、ABP应用层——权限验证
点这里进入ABP系列文章总目录 ABP(现代ASP.NET样板开发框架)系列之18.ABP应用层——权限验证 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目 ...
- ABP(现代ASP.NET样板开发框架)系列之20、ABP展现层——动态生成WebApi
点这里进入ABP系列文章总目录 ABP(现代ASP.NET样板开发框架)系列之20.ABP展现层——动态生成WebApi ABP是“ASP.NET Boilerplate Project (ASP.N ...
- ABP(现代ASP.NET样板开发框架)系列之3、ABP分层架构
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之3.ABP分层架构 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...
- ABP(现代ASP.NET样板开发框架)系列之4、ABP模块系统
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之4.ABP模块系统 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...
- ABP(现代ASP.NET样板开发框架)系列之5、ABP启动配置
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之5.ABP启动配置 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...
- ABP(现代ASP.NET样板开发框架)系列之6、ABP依赖注入
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之6.ABP依赖注入 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...
- ABP(现代ASP.NET样板开发框架)系列之7、ABP Session管理
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之7.ABP Session管理 ABP是“ASP.NET Boilerplate Project (ASP.NET ...
- ABP(现代ASP.NET样板开发框架)系列之8、ABP日志管理
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之8.ABP日志管理 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...
- ABP(现代ASP.NET样板开发框架)系列之9、ABP设置管理
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之9.ABP设置管理 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...
随机推荐
- TypeScript: Angular 2 的秘密武器(译)
本文整理自Dan Wahlin在ng-conf上的talk.原视频地址: https://www.youtube.com/watch?v=e3djIqAGqZo 开场白 开场白主要分为三部分: 感谢了 ...
- 通过一个demo了解Redux
TodoList小demo 效果展示 项目地址 (单向)数据流 数据流是我们的行为与响应的抽象:使用数据流能帮我们明确了行为对应的响应,这和react的状态可预测的思想是不谋而合的. 常见的数据流框架 ...
- Socket聊天程序——Common
写在前面: 上一篇记录了Socket聊天程序的客户端设计,为了记录的完整性,这里还是将Socket聊天的最后一个模块--Common模块记录一下.Common的设计如下: 功能说明: Common模块 ...
- 我为Net狂 ~ 社交平台系列小集合!
微信平台: 我为Net狂(dotNetCrazy) 资源贴吧: http://tieba.baidu.com/f?kw=毒逆天 个人博客: http://dunitian.cnblogs.com/ h ...
- IE的F12开发人员工具不显示问题
按下F12之后,开发人员工具在桌面上看不到,但是任务栏里有显示.将鼠标放在任务栏的开发人员工具上,出现一片透明的区域,选中之后却出不来.将鼠标移动到开发人员工具的缩略图上,右键-最大化,工具就全屏出现 ...
- SVD奇异值分解的基本原理和运用
SVD奇异值分解: SVD是一种可靠的正交矩阵分解法.可以把A矩阵分解成U,∑,VT三个矩阵相乘的形式.(Svd(A)=[U*∑*VT],A不必是方阵,U,VT必定是正交阵,S是对角阵<以奇异值 ...
- PHP的学习--RSA加密解密
PHP服务端与客户端交互或者提供开放API时,通常需要对敏感的数据进行加密,这时候rsa非对称加密就能派上用处了. 举个通俗易懂的例子,假设我们再登录一个网站,发送账号和密码,请求被拦截了. 密码没加 ...
- 现代3D图形编程学习-基础简介(3)-什么是opengl (译)
本书系列 现代3D图形编程学习 OpenGL是什么 在我们编写openGL程序之前,我们首先需要知道什么是OpenGL. 将OpenGL作为一个API OpenGL 通常被认为是应用程序接口(API) ...
- 程序猿都没对象,JS竟然有对象?
现在做项目基本是套用框架,不论是网上的前端还是后端框架,也会寻找一些封装好的插件拿来即用,但还是希望拿来时最好自己过后再回过头了解里面的原理,学习里面优秀的东西,不论代码封装性,还是小到命名. 好吧, ...
- C# 对象实例化 用json保存 泛型类 可以很方便的保存程序设置
用于永久化对象,什么程序都行,依赖NewtonSoft.用于json序列化和反序列化. using Newtonsoft.Json; using System; using System.Collec ...