061_Apex 异常捕捉
Trigger 中的错误处理
在 Trigger 中,我们可以为进行操作的数据进行验证,类似于验证规则。如果遇到不符合条件的数据,可以通过 addError() 函数来将错误显示给用户,并记录日志。
在如下代码中,当一个“业务机会”对象被插入或更新之前,系统会检查“金额”字段的值是否不小于1000。如果“金额”的数值小于1000,该“业务机会”记录将不能被插入或更新。
错误信息的显示适用于前端和后端:
- 如果该记录是从用户页面修改的,则用户会看到错误信息
- 如果该记录是从 Apex 程序中被插入或修改,则错误信息会被记录在日志中
trigger OppyMaxAmountTrigger on Opportunity (before insert, before update) {
for(Opportunity opp : Trigger.New) {
if(opp.amount < 1000) {
opp.addError('Amount should not be less than 1000!');
}
}
}Apex 例如如果在批量处理的过程中 出现的某一条Error处理方式:
public class LvOrderBy {
public string fieldNameOrPath {set;get;}
public string nullsPosition {set;get;}
public string sortDirection {set;get;}
private string nullsPosSOQL() {
// Name ASC NULLS FIRST, Id ASC NULLS FIRST",
if (nullsPosition!=null && nullsPosition!='') {
if ('first'.equalsIgnoreCase(nullsPosition)) {
return ' NULLS FIRST ';
} else if ('last'.equalsIgnoreCase(nullsPosition)) {
return ' NULLS LAST ';
} else {
throw new A('Invalid nullsPosition.[' + fieldNameOrPath + '], must be \'first\' or \'last\'');
}
} else {
return '';
}
}public class A extends Exception { // 使用object类型作为参数,将其序列化作为message,
// 方便与前段JS通信(JS可以解析message,从而细化错误消息)
public A(object msg) {
this.setMessage(JSON.serialize(msg));
} }
例子:批量更新一批数据,其中个别数据是由validation 限制的,其余的都可以正常update,那么问题来了
1. 如何正常更新正确的数据;
2.如何正常更新正确的数据,并且log能获取到哪条失败的数据;
3.当其中有不满足条件的就全部不更新;
4.当其中有不满足条件的就全部不更新,并且页面提示错误;
第一种情况:直接update goods;
这种属于第二种情况;
for(Goods__c god : goods){
god.GoodsDescribe__c = 'Nice2';
}
try{
update goods;
}
catch(Exception ex){
// system.debug(ex.getMessage());
}
这种属于第四种情况
for(Goods__c god : goods){
god.GoodsDescribe__c = 'Nice2';
}
try{
update goods;
}
catch(Exception ex){ // throw new MM(ex.getMessage());
}
public class MM extends Exception {
// 使用object类型作为参数,将其序列化作为message,
// 方便与前段JS通信(JS可以解析message,从而细化错误消息)
public MM(object msg) {
this.setMessage(JSON.serialize(msg));
}
}
Visualforce Error
MM: "Update failed. First exception on row 2 with id a007F000001FDheQAG; first error: FIELD_CUSTOM_VALIDATION_EXCEPTION, this is englist: [GoodsDescribe__c]"
Error is in expression '{!Doit}' in component <apex:commandButton> in page guoqingpage: Class.Controller.Doit: line 20, column 1
第三种情况邮件提醒:
如果换成 sendEmail(ex.getMessage());
public void sendEmail(String Msg){
// Send Email to Admin
Messaging.SingleEmailMessage message = new Messaging.SingleEmailMessage();
message.setToAddresses(new String[] { 'guang@%%.com' });
message.setSubject('Group Upsert');
message.sethtmlBody('Error:'+Msg);
Messaging.sendEmail(new Messaging.Email[] {message});
}
assertEquals的用法:
Goods__c a = new Goods__c();
a.Name = 'testScheduledApexFromTestMethod';
insert a; System.assertEquals('testScheduledApexFromTestMethod1',
[SELECT Id, Name FROM Goods__c WHERE Id = :a.Id].Name);
Database.upsert(goods,false); 这种写法可以忽悠掉错误的数据而不终止insert,正常的数据还是可以插入的,忽略错误的;
对Database.insert(List<SObject> sobjects, allOrNothing)方法中第二个参数的认识:
如果allOrNothing为false表示允许部分insert成功,如果true表示一有失败全部操作失败,项目中多用false。
实例:
List<Account> accList = new List<Account>{
new Account(Name='ttt'),
new Account()
};
Database.SaveResult[] srList = Database.insert(accList, false);
for(Database.SaveResult sr : srList) {
if (!sr.isSuccess()) {
// Operation failed, so get all errors
for(Database.Error err : sr.getErrors()) {
System.debug('The following error has occurred.');
System.debug(err.getStatusCode() + ': ' + err.getMessage());
System.debug('Fields that affected this error: ' + err.getFields());
}
}
}
System.DmlException: Update failed. First exception on row 0 with id 0051s000002aFxUAAU;
first error: MIXED_DML_OPERATION, DML operation on setup object is not permitted after you have updated a non-setup object (or vice versa): User, original object: BatchStatus__c: []
https://www.javaniceday.com/post/mixed_dml_operation-error-and-apex-unit-tests-how-to-fix-it-#title4
https://blog.csdn.net/qq_38261445/article/details/104236604:
简单说就是不能在一个事务中又更新case 又更新User;
061_Apex 异常捕捉的更多相关文章
- 基础知识《十》java 异常捕捉 ( try catch finally ) 你真的掌握了吗?
本文转载自 java 异常捕捉 ( try catch finally ) 你真的掌握了吗? 前言:java 中的异常处理机制你真的理解了吗?掌握了吗?catch 体里遇到 return 是怎么处理 ...
- Java多线程——<七>多线程的异常捕捉
一.概述 为什么要单独讲多线程的异常捕捉呢?先看个例子: public class ThreadException implements Runnable{ @Override public void ...
- Oracle- 存储过程和异常捕捉
这段时间晚上有时候去打打球,回家看看电视剧,日子一天天过…….学了点ORACLE存储过程基础,作一下备注,以便日后需查阅. 创建无参存储过程 create procedure p_myPro1 is ...
- php错误及异常捕捉
原文:php错误及异常捕捉 在实际开发中,错误及异常捕捉仅仅靠try{}catch()是远远不够的. 所以引用以下几中函数. a) set_error_handler 一般用于捕捉 E_NOTI ...
- android中全局异常捕捉
android中全局异常捕捉 只要写代码就会有bug,但是我们要想办法收集到客户的bug.有第三方bugly或者友盟等可以收集.但是,android原生就提供了有关收集异常的api,所以我们来学习一下 ...
- [iOS]异常捕捉
UncaughtExceptionHandler.h #import <Foundation/Foundation.h> NS_ASSUME_NONNULL_BEGIN @interfac ...
- Spring 全局异常捕捉
Spring全局异常捕捉类 注解@ControllerAdvice package com.sicdt.sicsign.web.bill.controller; import org.springfr ...
- 5.全局异常捕捉【从零开始学Spring Boot】
在一个项目中的异常我们我们都会统一进行处理的,那么如何进行统一进行处理呢? 新建一个类GlobalDefaultExceptionHandler, 在class注解上@ControllerAdvice ...
- springboot(四)拦截器和全局异常捕捉
github代码:https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/spb-brian-query-service 全部 ...
- SQL Server Try Catch 异常捕捉
SQL Server Try Catch 异常捕捉 背景 今天遇到一个关于try catch 使用比较有意思的问题.如下一段代码: SELECT @@TRANCOUNT AS A BEGIN TRY ...
随机推荐
- git提交命令
链接:https://www.waimaiguai.com/technology/article/5425017来源:外卖怪 外卖怪技术学习git更新代码命令2022-08-17 02:56:11gi ...
- leecode72. 编辑距离
72. 编辑距离 给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 . 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个 ...
- Create React App 安装时出现的错误解决方法
安装很简单 创建一个文件夹 xxx 第一步:npx create-react-app my-app 第二部:cd my-app 第三部:npm start 安装时出现的错误 一 解决方案 一: 全 ...
- 19_webpack_externals
假如我们购买了CDN服务器为我们的网站的访问速度进行优化,那么我们,该如何配置 假如我的CDN为:https://mr-hou88888/cdn/那么publicPath该如何配置 1.配置publi ...
- 模拟ATM系统 —— 用户存款、取款、转账、修改密码和销户功能
接着上一篇: 5.用户存款功能 分析: *存款就是拿到当前账户对象 *然后让用户输入存款的金额 *调用账户对象的setMoney方法将账户余额修改成存钱后的余额 *存款后需要查询当前账户信息,确认是否 ...
- 来自StateOfJS调查:2022年JavaScript生态圈趋势报告(前端早读课)
原文 我这里记录些觉得有趣的. Promise.allSettled() 完成所有输入的方法,no matter what,返回对应的状态和值/原因,这对想知道所有返回状态的业务很好用:使用async ...
- ES实战-trying to create too many buckets
场景 es查询报错,报错如下: trying to create too many buckets. must be less than or equal to: [10000] but was [1 ...
- IaaS--云硬盘(何恺铎《深入浅出云计算》笔记整理)
[概念] 云硬盘,又叫做"云盘"或者"云磁盘",就是云虚拟机上可以挂载和使用的硬盘.这里,它既包含了用于承载操作系统的系统盘,也包括了承载数据的数据盘.云厂商对 ...
- pytest-2 之前后置及 conftest.py+fixture+yield实现用例前后置
pytest测试用例及类级别的前置,可以和unittest一样进行定义,也可以把该前置方法或类定义到conftest.py里,而在需要前置的方法的参数里加上该前置名作为参数: pytest有两种方式来 ...
- twenty two
打包处理less文件 1,运行npm i less-loader@10.0.1 less@4.1.1 -D 2, 在webpack.config.js的module->rules数组中 rule ...