接触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,望技术有成后能回来看见自己的脚步

转载于:https://www.cnblogs.com/CKExp/p/10776948.html

ABP框架展示异常信息相关推荐

  1. Django框架(展示图书信息简易版)

    Linux环境下 创建虚拟环境 在python3中,创建虚拟环境 mkvirtualenv -p python3 虚拟机名称 mkvirtualenv -p python3 py_django 查看创 ...

  2. abp接口如何返回中文异常信息

    各位大佬求助!!! abp接口如何返回中文异常信息? 现在的结果是: 想要的结果是:

  3. ABP开发框架前后端开发系列---(8)ABP框架之Winform界面的开发过程

    在前面随笔介绍的<ABP开发框架前后端开发系列---(7)系统审计日志和登录日志的管理>里面,介绍了如何改进和完善审计日志和登录日志的应用服务端和Winform客户端,由于篇幅限制,没有进 ...

  4. abp.ajax get,ABP框架中导航菜单的使用及JavaScript API获取菜单的方法

    每一个WEB应用程序都有导航菜单,Abp也为用户提供了通用的创建和显示菜单方式. 创建菜单一个应用程序可能包含不同的模块,而每个模块都可能有它自己的菜单项.在Abp中,需要创建一个派生自Navigat ...

  5. ABP 框架官网学习资料

    ABP是"ASP.NET Boilerplate Project (ASP.NET样板项目)"的简称. [新思想.新技术.新架构--更好更快的开发现代ASP.NET应用程序] AS ...

  6. ABP框架 v2.7.0已经发布!

    ABP框架和ABP商业版 v2.7已经发布.我们没有为2.4,2.5和2.6发布博客文章,所以这篇文章也将涵盖这几个版本中新增内容和过去的2个月里我们完成了什么. 关于发布周期与开发 之前说过我们已经 ...

  7. 获取异常信息_如何在 ASP.NET Core 中实现全局异常拦截

    异常是一种运行时错误,当异常没有得到适当的处理,很可能会导致你的程序意外终止,这篇就来讨论一下如何在 ASP.Net Core MVC 中实现全局异常处理,我会用一些 样例代码 和 截图 来说明这些概 ...

  8. ABP开发框架前后端开发系列---(9)ABP框架的权限控制管理

    在前面两篇随笔<ABP开发框架前后端开发系列---(7)系统审计日志和登录日志的管理>和<ABP开发框架前后端开发系列---(8)ABP框架之Winform界面的开发过程>开始 ...

  9. java 异常国际化_基于springboot实现http响应异常信息国际化

    背景 国际化是指在设计软件,将软件与特定语言及地区脱钩的过程.当软件被移植到不同的语言及地区时,软件本身不用做内部工程上的改变或修正. 本文提到的异常响应信息国际化是指:前端向后台发起请求,后台在处理 ...

最新文章

  1. python的编程模式-Python 编程,应该养成哪些好的习惯?
  2. Win10怎么设置虚拟内存?
  3. centos7 kickstart 使用小结
  4. 二维数组foreach嵌套遍历,判断连续3天以上的算有效数据
  5. java hashmap实例_java HashMap详解及实例代码
  6. java程序员个人能力介绍_Java操作员能力问题
  7. 免费SSL申请:(各大服务商资源综合)- 免费获取
  8. CentOS 编译 Nginx 服务
  9. 3-(基础入门篇)稍微了解一下(需要知道的关于Lua的一些基本的知识)
  10. ajax后台重定向会返回什么_处理jquery ajax重定向
  11. 一个屌丝程序猿的人生(四十九)
  12. 计算机检索系统功能,文学多功能计算机自动检索系统研究
  13. 时间线vue,类似物流快递运单追踪
  14. 【SAP Basis】SAP用户账号管理
  15. 最新《JK学院 C语言教程培训 C语言教程+源代码》
  16. 手动从注册表添加“从这打开CMD”命令
  17. S2B2C模式学习总结
  18. InfluxDB2.2及Influx安装
  19. 正在家里愉快办公,突然被通知公司倒闭,员工:没想到来得这么快
  20. Bison介绍[转]

热门文章

  1. 2022-2028年中国汽车零部件行业市场研究及前瞻分析报告
  2. Pinia轻量级状态管理
  3. 【读书笔记】知易行难,多实践
  4. ImportError: No module named tensorflow.compat.v1 忽略已经安装的某个包版本 忽略已安装版本...
  5. HMM——维特比算法(Viterbi algorithm)
  6. LeetCode简单题之分割平衡字符串
  7. LeetCode简单题之删除排序链表中的重复元素
  8. Python3.8.5最新版安装教程(含老版本卸载教程)
  9. App性能分析数据监控
  10. NVIDIA GPU自动调度神经网络