salesforce 零基础学习(五十四)常见异常友好消息提示
异常或者error code汇总:https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/sforce_api_calls_concepts_core_data_objects.htm
做项目的时候有很多异常是我们经常遇到的:
1.空指针异常;
2.死锁或者超时;
3.级联删除时无级联表操作权限导致删除失败;
4.一次请求查询超过50000条数据;
5.查询时偏移量超过2000;
6.不满足Validation Rule条件;
7.必填字段为空;
8.unique字段记录添加重复。
上述问题很多可以封装公共方法来捕获异常并且返回友好的提示信息,免得将异常直接抛出,导致用户一头雾水。
此篇针对常见异常进行最基本的封装,方便后期项目有类似需求可以直接使用。
ErrorHelper:此类封装的getUserFriendlyMessage方法用于当程序操作出现异常时,可以返回友好的错误提示信息,第一个参数是errormessage,即error.getMessage(),第二个参数为sObject的API Name。
1 global with sharing class ErrorHelper { 2 private static final String NULL_POINTER_EXCEPTION = '空指针错误'; 3 private static final String RECORD_ALREADY_INPROCESS = '记录已经被锁定'; 4 private static final String RECORD_OVER_LIMIT = '查询最多只能50000条,请输入搜索条件重新搜索'; 5 private static final String RECORD_OFFSET_OVER_LIMIT = '数据最多只能查询当前检索条件前2000条,请更改检索条件重试'; 6 private static final String RECORD_ALREADY_IN_PROCESS = '当前记录已经在流程中,如有问题,请与管理员联系'; 7 public static String getUserFriendlyMessage(String msg,String sObjectName) { 8 String errorMessage; 9 //空指针错误:System.NullPointerException: Attempt to de-reference a null object 10 if(msg.contains('NullPointerException')){ 11 errorMessage = NULL_POINTER_EXCEPTION; 12 } 13 //死锁或者超时 14 else if(msg.contains('UNABLE_TO_LOCK')){ 15 errorMessage = RECORD_ALREADY_INPROCESS; 16 } 17 //级联删除,没有当前表或者关联表权限导致的错误 18 else if(msg.contains('DELETE_REQUIRED_ON_CASCADE')) { 19 20 } 21 //查询50001 22 else if(msg.contains('Too many query rows')) { 23 errorMessage = RECORD_OVER_LIMIT; 24 } 25 //offset 超过2000 26 else if(msg.contains('Maximum SOQL offset allowed is 2000')) { 27 errorMessage = RECORD_OFFSET_OVER_LIMIT; 28 } 29 //当前记录已经在审批流中 30 else if(msg.contains('ALREADY_IN_PROCESS')) { 31 errorMessage = RECORD_ALREADY_IN_PROCESS; 32 } 33 //Validation Rule失败 34 //eg: Update failed. First exception on row 0 with id a052800000BvtqEAAR; first error: FIELD_CUSTOM_VALIDATION_EXCEPTION, 商品价格不能为空且必须大于0.: [GoodsPrice__c] 35 else if (msg.contains('FIELD_CUSTOM_VALIDATION_EXCEPTION')){ 36 errorMessage = getUserFriendlyMessage4ValidationException(msg,sObjectName); 37 } 38 //必填字段 39 //eg:Insert failed. First exception on row 0; first error: REQUIRED_FIELD_MISSING, Required fields are missing: [Company_Name__c]: [Company_Name__c] 40 else if(msg.contains('REQUIRED_FIELD_MISSING')){ 41 errorMessage = getUserFriendlyMessage4RequiredField(msg,sObjectName); 42 } 43 //对于unique的字段进行相同值插入会报此种错误:System.DmlException: Insert failed. First exception on row 0; first error: DUPLICATE_VALUE, duplicate value found: Company_Code_Unique__c duplicates value on record with id: a032800000KOlEr: [] 44 45 else if(msg.contains('DUPLICATE_VALUE')) { 46 errorMessage = getUserFriendlyMessage4DuplicateValue(msg,sObjectName); 47 } 48 return errorMessage; 49 } 50 51 /** 52 *针对unique字段添加重复值的异常获取友好的message 53 *@param msg : 异常信息 eg : System.DmlException: Insert failed. First exception on row 0; first error: DUPLICATE_VALUE, duplicate value found: Company_Code_Unique__c duplicates value on record with id: a032800000KOlEr: [] 54 *@param sObjectName : sObject的API Name 55 *@return 56 */ 57 private static String getUserFriendlyMessage4DuplicateValue(String msg,String sObjectName) { 58 String errorMessage = msg; 59 Integer pointer; 60 String fieldName; 61 if(!msg.contains('DUPLICATE_VALUE')) { 62 return errorMessage; 63 } 64 pointer = errorMessage.indexOf('DUPLICATE_VALUE') + 16; 65 if(pointer > -1) { 66 errorMessage = errorMessage.mid(pointer, errorMessage.length()); 67 } 68 pointer = errorMessage.indexOf('duplicates'); 69 if(pointer > -1) { 70 errorMessage = errorMessage.mid(0,pointer); 71 } 72 pointer = errorMessage.indexOf(':') + 1; 73 if(pointer > -1) { 74 fieldName = errorMessage.mid(pointer,errorMessage.length()).trim(); 75 Schema.DescribeFieldResult fieldResult = getSObjectFieldDescribeResult(sObjectName,fieldName); 76 if(fieldResult != null) { 77 fieldName = fieldResult.getLabel(); 78 } 79 } 80 errorMessage = errorMessage.mid(0,pointer) + fieldName; 81 return errorMessage; 82 } 83 84 /** 85 *针对Validation Rule的异常获取友好的message 86 *@param msg : 异常消息 eg: Update failed. First exception on row 0 with id a052800000BvtqEAAR; first error: FIELD_CUSTOM_VALIDATION_EXCEPTION, 商品价格不能为空且必须大于0.: [GoodsPrice__c] 87 *@param sObjectName : sObject的API Name 88 *@return 返回有问题的field labe + : + error message (eg : GoodsPrice : 商品价格不能为空且必须大于0.) 89 */ 90 private static String getUserFriendlyMessage4ValidationException(String msg,String sObjectName){ 91 String errorMessage = msg; 92 Integer pointer; 93 String fieldName; 94 if (msg.contains('FIELD_CUSTOM_VALIDATION_EXCEPTION')){ 95 pointer = errorMessage.indexOf('FIELD_CUSTOM_VALIDATION_EXCEPTION,') + 34; 96 errorMessage = errorMessage.mid(pointer, errorMessage.length()); 97 } else { 98 return msg; 99 } 100 pointer = errorMessage.indexOf('\n'); 101 if(pointer > -1){ 102 errorMessage = errorMessage.mid(0, pointer); 103 } 104 pointer = errorMessage.indexOf(':'); 105 if(pointer > -1){ 106 //去除error message中的 [] 107 fieldName = errorMessage.mid(pointer + 1,errorMessage.length()-1).remove('[').remove(']').trim(); 108 errorMessage = errorMessage.mid(0, pointer); 109 } 110 if(fieldName != null) { 111 Schema.DescribeFieldResult fieldDescribeResult = getSObjectFieldDescribeResult(sObjectName,fieldName); 112 if(fieldDescribeResult != null) { 113 errorMessage = fieldDescribeResult.getLabel() + ' : ' + errorMessage; 114 } 115 } 116 return errorMessage; 117 } 118 119 120 /** 121 * 针对必填字段获取友好的message 122 * @param msg : 异常消息 eg: Insert failed. First exception on row 0; first error: REQUIRED_FIELD_MISSING, Required fields are missing: [Company_Name__c]: [Company_Name__c] 123 * @param sObjectName : sObject的API Name 124 * @return : 友好消息 eg : Required fields are missing: Company Name (field label name) 125 */ 126 private static String getUserFriendlyMessage4RequiredField(String msg,String sObjectName){ 127 String errorMessage = msg; 128 if(!errorMessage.contains('first error:')) { 129 return errorMessage; 130 } 131 Integer pointer; 132 String fieldName; 133 //获取first error 以后的message信息 134 pointer = errorMessage.indexOf('first error:') + 12; 135 errorMessage = errorMessage.mid(pointer, errorMessage.length()); 136 if(pointer > -1){ 137 pointer = errorMessage.indexOf(',') + 1; 138 errorMessage = errorMessage.mid(pointer, errorMessage.length()); 139 } 140 141 pointer = errorMessage.indexOf(']:'); 142 if(pointer > -1){ 143 errorMessage = errorMessage.mid(0, pointer + 1); 144 } 145 fieldName = errorMessage.mid(errorMessage.indexOf('[') + 1,errorMessage.indexOf(']')-errorMessage.indexOf('[')-1).trim(); 146 if(fieldName != null) { 147 Schema.DescribeFieldResult fieldResult = getSObjectFieldDescribeResult(sObjectName,fieldName); 148 if(fieldResult != null) { 149 fieldName = fieldResult.getLabel(); 150 } 151 } 152 pointer = errorMessage.indexOf('['); 153 if(pointer > -1){ 154 errorMessage = errorMessage.mid(0, pointer); 155 } 156 errorMessage += fieldName; 157 return errorMessage; 158 } 159 160 /* 161 * 通过sObject名称以及field名称获取field相关describe result信息 162 * @param sObjectName object的api name 163 * @param fieldName field的api name 164 * @return 此field的describe result 165 */ 166 private static Schema.DescribeFieldResult getSObjectFieldDescribeResult(String sObjectName,String fieldName) { 167 List<Schema.DescribeSObjectResult> sObjectResultList = Schema.describeSObjects(new String[]{sObjectName}); 168 if(sObjectResultList == null || sObjectResultList.size() == 0) { 169 return null; 170 } else { 171 Schema.DescribeSObjectResult sObjectResult = sObjectResultList.get(0); 172 Map<String,SObjectField> maps = sObjectResult.fields.getMap(); 173 Schema.SObjectField sObjectField = maps.get(fieldName); 174 if(sObjectField == null) { 175 return null; 176 } else { 177 Schema.DescribeFieldResult fieldDescribeResult = sObjectField.getDescribe(); 178 return fieldDescribeResult; 179 } 180 } 181 } 182 183 }
使用演示:
1.Unique字段插入重复
2.必填字段为空
3.Validation Rule未通过
总结:此篇主要封装简单的异常的友好显示。当前很多常量都放在了程序里,建议放在custom label中,然后对相关进行translate,这样可以保证国际化使用,否则现在language为英文可以,中文使用会有问题,有用到的可以自行优化。
转载于:https://www.cnblogs.com/zero-zyq/p/6143983.html
salesforce 零基础学习(五十四)常见异常友好消息提示相关推荐
- salesforce 零基础学习(十八)WorkFlow介绍及用法
说起workflow大家肯定都不陌生,这里简单介绍一下salesforce中什么情况下使用workflow. 当你分配许多任务,定期发送电子邮件,记录修改时,可以通过自动配置workflow来完成以上 ...
- salesforce零基础学习(八十九)使用 input type=file 以及RemoteAction方式上传附件
在classic环境中,salesforce提供了<apex:inputFile>标签用来实现附件的上传以及内容获取.salesforce 零基础学习(二十四)解析csv格式内容中有类似的 ...
- [Python从零到壹] 五十四.图像增强及运算篇之局部直方图均衡化和自动色彩均衡化处理
首先,祝大家教师节和中秋节快乐! 欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文 ...
- Java基础学习——第十四章 网络编程
Java基础学习--第十四章 网络编程 一.网络编程概述 计算机网络: 把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大.功能强的网络系统,从而使众多的计算机可以方便地互相传递信 ...
- 罗马音平假名中文可复制_日语零基础入门五十音,日语零基础五十音图表
日语零基础入门五十音,日语入门的最基本要求就是记住五十音图,但是这个记住不仅是你能背下来或是默写下来.而是你需对号入座! 下面是一张五十音图表. 即每个假名单独拿出来你要立马反应出来怎么读.其重要性甚 ...
- salesforce零基础学习(九十七)Big Object
我们在salesforce学习工作中,接触到很多的 标准的 object ,自定义 object 以及外部object.我们使用SOQL / SOSL 进行搜索,熟知他们的各种limitation,查 ...
- 零基础学习SpringSecurity OAuth2 四种授权模式(理论+实战)(配套视频讲解)
配套视频直达 背景 前段时间有同学私信我,让我讲下Oauth2授权模式,并且还强调是零基础的那种,我也不太理解这个零基础到底是什么程度,但是我觉得任何阶段的同学看完我这个视频,对OAuth2的理解将会 ...
- salesforce 零基础学习(四十二)简单文件上传下载
项目中,常常需要用到文件的上传和下载,上传和下载功能实际上是对Document对象进行insert和查询操作.本篇演示简单的文件上传和下载,理论上文件上传后应该将ID作为操作表的字段存储,这里只演示文 ...
- salesforce 零基础学习(三十四)动态的Custom Label
custom label在项目中经常用到,常用在apex class或者VF里面用来显示help text或者error message.有的时候我们需要用到的信息是动态变化的,那样就需要动态来显示信 ...
最新文章
- arcgis超级工具密码_忘记电脑密码怎么办?只需要简单这样做
- 国内外免费PHP开源建站程序
- idea与mysql连接时,遇见的小问题
- Java教程分享:JVM垃圾回收机制之对象回收算法
- git使用---工作区和暂存区
- Android之SwipeRefreshLayout
- 大润发java薪资,大润发edp员工面试:不说位置了,怕备查,哈哈 第一次去是因 - 职朋职业圈...
- 主从复制2——拥有海量数据主服务器的主从复制模型详细实现;
- ASP.NET RouteModule相关的一些东西
- 筛选出c语言成绩前五名的记录,c语言课程论文设计成绩记录簿.doc
- 转载 关于git的常用命令总结
- 进制转化(北理乐学编程题目)
- Mysql环境变量的配置(详细图解)
- 微信小程序优购商城项目总结
- 基于Opencv的几种立体匹配算法+ELAS
- 软件设计师近10年上午真题解析知识点(并非绝对完整版)
- CF106C Buns动态规划解决多重背包
- mysql统计分数段人数_mysql 按分数段,每个专业分数段统计人数
- springboot(十六) 2.0变化
- JetBrain系列软件的学生授权认证及认证到期重新申请授权
热门文章
- 【SDOI 2011】Paint 染色
- Kotlin Native新增Objective-C互操作能力以及对WebAssembly的支持
- Thinkphp5 还有这种操作?
- Andorid Scrolling Activity(CoordinatorLayout详情)
- Provisioning Services 7.8 入门系列教程之十一 通过版本控制自动更新虚拟磁盘
- “BindingNavigator”如何在删除前弹出确认框?
- 想在创建虚拟机的时候指定ip调研
- Red Hat 6.0 Installation Steps
- 建立管理SQL Server登录帐户
- [转]Eclipse RCP应用系统开发方法与实战2-- 定制应用程序窗口属性