ABP框架展示异常信息
接触ABP框架有一段时间了,也遇到了一些问题,看了官网文档,但是或许是看的不够细致的原因,实际开发中还是遇到了一些问题,耗费了时间去处理,回头一看,原来文档中早已提及。
开发环境:ABP+MPA模式+Asp.Net Core
一、异常信息处理
犹如ABP官网文档所介绍的,ABP已经帮我们把异常这块处理的很完善了,我们要做的就是利用好ABP处理异常的功能。

ABP提供了直接将应用层对外服务的功能,通过ABP运行时所创建的动态API层,我们可以使用js方法去直接调用应用层服务,当然直接访问控制器下的方法并没有被舍弃。

在ABP内自动封装好了一批处理异常的类,配合着这些异常类的使用,ABP在前端也封装了一些方法,方便我们处理异常信息,同时我们也可以改造前端在展示异常的方式,ABP封装的是使用Message API展示异常信息并使用的是sweetAlert插件,ABP前端js中提供了方式可以使得我们阻止默认的展示,进而使用自定义的展示插件和展示方式。

在封装的类中,UserFriendlyException是对用户友好的,对于一些操作可能产生的问题,可以通过抛出UserFriendlyException直接展示给用户看,而对于其它异常,前端会将详细信息的隐藏,因为用户并不会关心具体报错原因,只知道是报错了。在代码中,有些操作可能需要我们进行判断,然后反馈给用户,以便提示用户更改相关数据。
[AbpAuthorize(AppPermissions.Pages_Standard_ItemCode_Create)]
private async Task CreateItemCodeAsync(CreateOrUpdateItemCodeInput input)
{
var itemCode = ObjectMapper.Map<ItemCode>(input.ItemCode);
itemCode.Id = itemCode.CreateUniqueItemCode(); var existedItemCode = await _itemCodeRepository.FirstOrDefaultAsync(t => t.Id.Equals(itemCode.Id));
if (existedItemCode != null)
{
throw new UserFriendlyException(L("该检测项目已经存在."));
} await _itemCodeRepository.InsertAsync(itemCode);
}
如上,在做一个操作前,可能需要判断是否有相同的记录,如果有,需要提示给用户,通过直接抛出UserFriendlyException,在控制器内或在应用层抛出异常都行,可以将信息直接呈现给用户,但是需要注意的是有一些条件限制,需要满足相关的条件才能获取到该错误信息,否则很有可能拿到如下结果或是英文错误:"An error has occurred! Error detail not sent by server."

二、展示异常信息的方式
在ABP文档中,专门有一篇文章是处理异常的,https://aspnetboilerplate.com/Pages/Documents/Handling-Exceptions。

1、非Ajax请求,则直接展示错误页,此处模拟抛出两种异常类型,然后在界面中看异常信息。
public IActionResult Index()
{
//throw new System.Exception("error message");
throw new UserFriendlyException("error message");
}
如果是抛出的异常不是UserFriendlyException类型,则错误页中展示的信息可能会被隐藏,展示的是描述性的,只需要知道内部出错就行。

当抛出的是UserFriendlyException类型时,可以看到一些直观的错误信息。

当然,可以在WebCoreModule模块的预加载方法中启动展示详细信息。
Configuration.Modules.AbpWebCommon().SendAllExceptionsToClients = true;
比如开启后,可以看到如下具体错误信息,虽然这些信息对于用户来讲是没有什么价值的。

2、Ajax请求中,跟着官方给定的文档走一遍是没有错的,就怕一些小细节没有把握到,然后产生大问题,Ajax形式的调用并结合WrapResult特性使用后,在出现异常时,会将数据封装成如下简约形式。
{
"targetUrl": null,
"result": null,
"success": false,
"error": {
"message": "An internal error occurred during your request!",
"details": "..."
},
"unAuthorizedRequest": false
}
这里需要注意一个关键的一点,是调用控制器下某个方法的返回类型,必须要object、JsonResult和ObjectResult类型,否则将会页面错误框中看不到具体的错误信息。

从开发习惯来讲,控制器中的方法返回值类型,我喜欢写如下的格式(错误用法),直接使用IActionResult很方便,但是也会有麻烦,
[HttpPost]
public async Task<IActionResult> CreateXXX([FromBody]ItemCodeViewModel itemCodeViewModel)
{
//do something...return Json(xxx));
}
当在中抛出异常或是方法内调用应用层服务内抛出异常时,界面上的方法总是无法获取到异常信息,通过查看浏览器内响应的内容总是只会有错误页响应回来,而页面内只能看到"An error has occurred! Error detail not sent by server."

具体原因就是这个方法的返回值不符合ABP文档给定的要求,而这些细节,在初看文档或是二次看文档中都没有发现它,细节很重要!!!。
3、直接通过动态Api层请求应用层服务,这种情形下,当应用层抛出异常时,会将异常信息经WrapResult封装,在前端获取的错误信息便是直接封装完毕的错误信息,然后再经处理展示到页面中。
2019-04-27,望技术有成后能回来看见自己的脚步
ABP框架展示异常信息的更多相关文章
- 查看abp框架异常信息
abp框架中经常出现{"message":"An error has occurred."}的异常,并且也进入不到方法中,如果想查看详细信息,可以采用下面方法 ...
- ABP框架实战 1.基础信息维护
在之前的一个开发项目中,因为公司战略发展,引用了这个ABP开源框架作为新项目的基础版本,由于客户的要求需要迁移旧系统数据,以及其他的一些原因,数据库采用了Oracle数据库管理.所以引用了Dapper ...
- [译]ABP框架使用AngularJs,ASP.NET MVC,Web API和EntityFramework构建N层架构的SPA应用程序
本文转自:http://www.skcode.cn/archives/281 本文演示ABP框架如何使用AngularJs,ASP.NET MVC,Web API 和EntityFramework构建 ...
- 中小研发团队架构实践之生产环境诊断工具WinDbg 三分钟学会.NET微服务之Polly 使用.Net Core+IView+Vue集成上传图片功能 Fiddler原理~知多少? ABP框架(asp.net core 2.X+Vue)模板项目学习之路(一) C#程序中设置全局代理(Global Proxy) WCF 4.0 使用说明 如何在IIS上发布,并能正常访问
中小研发团队架构实践之生产环境诊断工具WinDbg 生产环境偶尔会出现一些异常问题,WinDbg或GDB是解决此类问题的利器.调试工具WinDbg如同医生的听诊器,是系统生病时做问题诊断的逆向分析工具 ...
- ABP框架 - 介绍 VS2017调试器无法附加到IIS进程(w3wp.exe) c# 动态实例化一个泛型类
ABP框架 - 介绍 在14,15年间带领几个不同的团队,交付了几个项目,在这个过程中,虽然几个项目的业务不一样,但是很多应用程序架构基础性的功能却是大同小异,例如认证.授权.请求验证.异常处理. ...
- ABP开发框架前后端开发系列---(8)ABP框架之Winform界面的开发过程
在前面随笔介绍的<ABP开发框架前后端开发系列---(7)系统审计日志和登录日志的管理>里面,介绍了如何改进和完善审计日志和登录日志的应用服务端和Winform客户端,由于篇幅限制,没有进 ...
- X-Admin&ABP框架开发-系统日志
网站正常运行中有时出现异常在所难免,查看系统运行日志分析问题并能够根据错误信息快速解决问题尤为重要,ABP对于系统运行日志这块已经做了很好的处理,默认采用的Log4Net已经足够满足开发过程中的需要了 ...
- 循序渐进VUE+Element 前端应用开发(12)--- 整合ABP框架的前端登录处理
VUE+Element 前端是一个纯粹的前端处理,前面介绍了很多都是Vue+Element开发的基础,从本章随笔开始,就需要进入深水区了,需要结合ABP框架使用(如果不知道,请自行补习一下我的随笔:A ...
- ABP框架搭建项目系列教程基础版完结篇
返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 经过前面十二篇的基础教程,现在终于该做个总结了. 回顾 第一篇,我们建议新手朋友们先通过ABP官网的启动模板生成解决方案,因为这样 ...
随机推荐
- CentOs 6 或 7 yum安装JDK1.8 (内含报 PYCURL ERROR 6 - "Couldn't resolve host 'mirrors.163.com'"错误解决方案)并分析为什么不能yum安装
查看JDK的安装路径 # java -version============================查看Linux系统版本信息# cat /etc/redhat-releaseCentOS r ...
- Ocelot中文文档-负载均衡
Ocelot能通过可用的下游服务对每个ReRoute进行负载平衡. 这意味着您可以扩展您的下游服务,并且Ocelot可以有效地使用它们. 可用的负载均衡器的类型是: LeastConnection - ...
- springAOP之代理
AOP是指面向切面编程. 在学习AOP之前先来了解一下代理,因为传说中的AOP其实也对代理的一种应用. 首先来看这样一段代码: public interface Hello { void say(St ...
- 一道面试题引发的思考(C#值类型和引用类型)
某年某月,笔者去面试招行的一个外包项目,辗转来到面试地点以后,面试官给了我一份试卷,试卷只有两道题目,其中一道是这样的: 阅读以下程序 class Program { struct Point { p ...
- Learn flask in the hard way:配置环境的安装
开发用的是win10的环境. 首先确保安装了python环境,个人比较适应python2.x的代码方式,所以安装的是python2.7.10. 另外IDE还是我最喜欢的pycharm. 然后开始安装F ...
- Beta 冲刺day2
1.昨天的困难,今天解决的进度,以及明天要做的事情 昨天的困难:昨天主要是在确认需求方面花了一些时间,后来终于确认了企业自查风险模块的需求问题 今天解决的进度:根据昨天确认下来的需求,我们基本上完成了 ...
- ArcGis SOE(server object extensions)之REST Template初体验
一.安装vs和arcgis server for .net(本例是vs2010.as 10),然后打开vs新建一个项目
- Linux(二十二)Ubuntu安装和配置
Ubuntu的介绍 Ubuntu是一个以桌面应用为主的开源GNU/Linux操作系统,Ubuntu是基于GNU/Linux,支持x86.amd64(即x64)和ppc架构,由全球化的专业开发团队(Ca ...
- 洛谷 P1053 解题报告
P1053 篝火晚会 题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了"小教官".在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有 ...
- csrf攻击与防范
CSRF(Cross Site Request Forgeries)跨网站请求伪造,也叫XSRF,通过伪装来自受信任用户的请求来攻击利用受信任网站. 与对比 xss:本网站运行了来自其它网站的脚本 c ...