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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/469741.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

★Anaconda中创建、切换、删除虚拟环境(指定仓库)

指定仓库安装源文件 pip install 包名 -i http://pypi.douban.com/simple 可以换源列表&#xff1a; 阿里云 https://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/ #常用 豆瓣(douban) http://pypi.douban.com/simple/ 清华…

怎样修改t3服务器地址,怎样修改t3服务器地址

怎样修改t3服务器地址 内容精选换一换华为云帮助中心&#xff0c;为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档&#xff0c;帮助您快速上手使用华为云服务。Atlas 200 DK开发者板支持通过USB端口或者网线与Ubuntu服务器…

结构体中.和-的用法

#include"stdio.h" #include"stdlib.h"struct linkwqf{int age;char * name;struct linkwqf* next; }; struct linkwqf linkwww1;/*第一种声明结构体类型变量的方法 这种方法意义不大*/ typedef struct linkwqf linkwww2;/*第一种声明结构体类型变量的方…

智慧交通day02-车流量检测实现03:辅助功能(交并比and候选框的表现形式)

学习目标 能够实现两个目标框的交并比 了解候选框在多目标跟踪中的表达方式及相应转换方法 IOU是交并比&#xff08;Intersection-over-Union&#xff09;是目标检测中使用的一个概念是产生的候选框&#xff08;candidate bound&#xff09;与原标记框&#xff08;ground tru…

电脑pro,拒绝等待!七彩虹全新设计师电脑ProMaster H1为创意加速

新年伊始&#xff0c;七彩虹科技正式发布了全新设计师领域整机系列&#xff1a;Colorful ProMaster(专业大师)。并同时公布了旗下第一款设计师电脑整机&#xff1a;Colorful ProMaster H1。其采用全新三面环绕布艺设计要素&#xff0c;搭载NVIDIA GeForce RTX Studio和英特尔傲…

智慧交通day02-车流量检测实现04:卡尔曼滤波器

1、背景介绍 卡尔曼滤波&#xff08;Kalman&#xff09;无论是在单目标还是多目标领域都是很常用的一种算法&#xff0c;我们将卡尔曼滤波看做一种运动模型&#xff0c;用来对目标的位置进行预测&#xff0c;并且利用预测结果对跟踪的目标进行修正&#xff0c;属于自动控制理论…

java 简单类继承

class Person {String name;int age;public String talk(){return "我是&#xff1a;"this.name",今年&#xff1a;"this.age"岁";}public Person()/* 无参数的构造函数*/{System.out.println("1.public Person(){}");} } class Stude…

成功解决 ProxyError: Conda cannot proceed due to an error in your proxy configuration

给win10的ubuntu1804安装anaconda, 执行conda create -n daily python3.7创建虚拟环境时报错 Collecting package metadata (current_repodata.json): failedProxyError: Conda cannot proceed due to an error in your proxy configuration. Check for typos and other confi…

android 4.2修改设置菜单的背景颜色

设置中的背景主要来主题的设置, 在4.X后, android添加了新的主题: Holo 从Settings/AndroidManifest.xml中找到: Xml代码 <application android:label"string/settings_label" android:icon"mipmap/ic_launcher_settings" android…

智慧交通day02-车流量检测实现05:卡尔曼滤波器实践(小车模型)

1.filterpy FilterPy是一个实现了各种滤波器的Python模块&#xff0c;它实现著名的卡尔曼滤波和粒子滤波器。我们可以直接调用该库完成卡尔曼滤波器实现。其中的主要模块包括&#xff1a; filterpy.kalman 该模块主要实现了各种卡尔曼滤波器&#xff0c;包括常见的线性卡尔曼滤…

Linux多线程——使用互斥量同步线程

前文再续&#xff0c;书接上一回&#xff0c;在上一篇文章&#xff1a;Linux多线程——使用信号量同步线程中&#xff0c;我们留下了一个如何使用互斥量来进行线程同步的问题&#xff0c;本文将会给出互斥量的详细解说&#xff0c;并用一个互斥量解决上一篇文章中&#xff0c;要…

智慧交通day02-车流量检测实现05:小车匀速案例

""" 现在利用卡尔曼滤波对小车的运动状态进行预测。主要流程如下所示&#xff1a;导入相应的工具包小车运动数据生成参数初始化利用卡尔曼滤波进行小车状态预测可视化&#xff1a;观察参数的变化与结果 """#导入包 from matplotlib import pyplo…

排座椅

题目描述 上课的时候总会有一些同学和前后左右的人交头接耳&#xff0c;这是令小学班主任十分头疼的一件事情。不过&#xff0c;班主任小雪发现了一些有趣的现象&#xff0c;当同学们的座次确定下来之后&#xff0c;只有有限的D对同学上课时会交头接耳。同学们在教室中坐成了M行…

智慧交通day02-车流量检测实现05:小车匀加速案例

""" 现在利用卡尔曼滤波对小车的运动状态进行预测。主要流程如下所示&#xff1a;导入相应的工具包小车运动数据生成参数初始化利用卡尔曼滤波进行小车状态预测可视化&#xff1a;观察参数的变化与结果 """#导入包 from matplotlib import pyplo…

智慧交通day02-车流量检测实现06:目标估计模型-卡尔曼滤波

在这里我们主要完成卡尔曼滤波器进行跟踪的相关内容的实现。 初始化&#xff1a;卡尔曼滤波器的状态变量和观测输入更新状态变量根据状态变量预测目标的边界框初始化&#xff1a; 状态量x的设定是一个七维向量&#xff1a; 分别表示目标中心位置的x,y坐标&#xff0c;面积s和当…

python或anaconda下安装opencv提示Error:No matching distribution found for opencv

python或anaconda下安装opencv提示Error&#xff1a;No matching distribution found for opencv 错误提示&#xff1a; ERROR: Could not find a version that satisfies the requirement python-opencv (from versions: none) ERROR: No matching distribution found for p…

iOS 10 的坑:新机首次安装 app,请求网络权限“是否允许使用数据”(转)

转载自&#xff1a;文&#xff0f;戴仓薯&#xff08;简书作者&#xff09;原文链接&#xff1a;http://www.jianshu.com/p/6cbde1b8b922症状 iOS 10 之后&#xff0c;陆陆续续地有用户联系我们&#xff0c;说新机第一次安装、第一次启动的时候&#xff0c;app 首屏一片空白&am…

智慧交通day02-车流量检测实现06:目标估计模型-卡尔曼滤波(汇总)

from __future__ import print_function from numba import jit import numpy as np from scipy.optimize import linear_sum_assignment from filterpy.kalman import KalmanFilter#计算IOU&#xff08;交并比&#xff09; jit def iou(bb_test,bb_gt):"""在两…

Redis入门指南(第2版) Redis设计思路学习与总结

https://www.qcloud.com/community/article/222 宋增宽&#xff0c;腾讯工程师&#xff0c;16年毕业加入腾讯&#xff0c;从事海量服务后台设计与研发工作&#xff0c;现在负责QQ群后台等项目&#xff0c;喜欢研究技术&#xff0c;并思考技术演变&#xff0c;专注于高并发业务架…

智慧交通day02-车流量检测实现07:匈牙利算法

匈牙利算法&#xff08;Hungarian Algorithm&#xff09;与KM算法&#xff08;Kuhn-Munkres Algorithm&#xff09;是用来解决多目标跟踪中的数据关联问题&#xff0c;匈牙利算法与KM算法都是为了求解二分图的最大匹配问题。 有一种很特别的图&#xff0c;就做二分图&#xff0…