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 异常捕捉的更多相关文章

  1. 基础知识《十》java 异常捕捉 ( try catch finally ) 你真的掌握了吗?

    本文转载自  java 异常捕捉 ( try catch finally ) 你真的掌握了吗? 前言:java 中的异常处理机制你真的理解了吗?掌握了吗?catch 体里遇到 return 是怎么处理 ...

  2. Java多线程——<七>多线程的异常捕捉

    一.概述 为什么要单独讲多线程的异常捕捉呢?先看个例子: public class ThreadException implements Runnable{ @Override public void ...

  3. Oracle- 存储过程和异常捕捉

    这段时间晚上有时候去打打球,回家看看电视剧,日子一天天过…….学了点ORACLE存储过程基础,作一下备注,以便日后需查阅. 创建无参存储过程 create procedure p_myPro1 is ...

  4. php错误及异常捕捉

    原文:php错误及异常捕捉 在实际开发中,错误及异常捕捉仅仅靠try{}catch()是远远不够的. 所以引用以下几中函数. a)   set_error_handler 一般用于捕捉  E_NOTI ...

  5. android中全局异常捕捉

    android中全局异常捕捉 只要写代码就会有bug,但是我们要想办法收集到客户的bug.有第三方bugly或者友盟等可以收集.但是,android原生就提供了有关收集异常的api,所以我们来学习一下 ...

  6. [iOS]异常捕捉

    UncaughtExceptionHandler.h #import <Foundation/Foundation.h> NS_ASSUME_NONNULL_BEGIN @interfac ...

  7. Spring 全局异常捕捉

    Spring全局异常捕捉类 注解@ControllerAdvice package com.sicdt.sicsign.web.bill.controller; import org.springfr ...

  8. 5.全局异常捕捉【从零开始学Spring Boot】

    在一个项目中的异常我们我们都会统一进行处理的,那么如何进行统一进行处理呢? 新建一个类GlobalDefaultExceptionHandler, 在class注解上@ControllerAdvice ...

  9. springboot(四)拦截器和全局异常捕捉

    github代码:https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/spb-brian-query-service 全部 ...

  10. SQL Server Try Catch 异常捕捉

    SQL Server Try Catch 异常捕捉 背景 今天遇到一个关于try catch 使用比较有意思的问题.如下一段代码: SELECT @@TRANCOUNT AS A BEGIN TRY ...

随机推荐

  1. Pytest 固件

    一.固件使用背景 在执行测试用例时,我们常常需要在测试用例执行的前后去完成一些额外的操作.例如针对于 Web 测试,在用例执行前需要打开浏览器,完成用户登录等一系列前置操作:在用例执行完成后,要清除浏 ...

  2. DOS命令操作

    打开CMD的方式 1.开始+系统+命令提示符 2.Win键+R 输入CMD打开控制台(推荐使用) 3.在任意的文件夹下面,按住shift+鼠标右键点击,在此处打开命令行窗口 4.资源管理器的地址栏前面 ...

  3. Java基础学习:12、类变量和类方法(静态变量/方法)

    一.类变量: 1.定义:类变量也叫静态变量,是该类所有对象(一个类可以new多个对象)共享的一个变量,任何一个该类变量去访问它时,取到的都是相同的值,同样一个该类的对象去修改它时,修改的也是同一个变量 ...

  4. SpringMVC的常用操作汇总

    基本操作 #类级别的注解 @Controller @RestController @RequestMapping("/hello") #springMVC常用方法级别注解 @Res ...

  5. 达芬奇18.1.2安装包下载+软件详细破解安装教程(Win&Mac)

    DaVinci Resolve v18.1.2是一款在同一个软件工具中,将剪辑.调色.视觉特效.动态图形和音频后期制作融于一身的解决方案!它采用美观新颖的界面设计,易学易用,能让新手用户快速上手操作, ...

  6. [转]Windows 批处理命令教程

    第一章 批处理基础 第一节 常用批处理内部命令简介 批处理定义:顾名思义,批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT或者CMD.这些命令统称批处理命令.小知识:可 ...

  7. 分布式锁 -- redis

    原理 redis设置一个key和value,如果存在则获取锁失败,不存在则获取锁成功处理业务,业务处理完成后删除这条数据,可以带个失效时间. 代码 public void handleInvoice( ...

  8. VSCode 抽取vue的代码片段

    在vscode中文件-->首选项-->用户片段,输入名字按去确定,输入代码片段 { "vue htm": { "scope": "html ...

  9. os-内核通知链notifier.c

    8. linux内核通知链 8.1. 概述 在Linux内核中,各个子系统之间有很强的相互关系,某些子系统可能对其它子系统产生的事件感兴趣.为了让某个子系统在发生某个事件时通知感兴趣的子系统,Linu ...

  10. iOS 过滤字符串

    //表示去掉字符串中的/符号 sysdate:[[self Gettime:strbegindate] stringByReplacingOccurrencesOfString:@"/&qu ...