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());
        }
    }

 

 

 

转载于:https://www.cnblogs.com/bandariFang/p/9628373.html

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

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

相关文章

从 C# 崩溃异常 中研究 页堆 布局

一&#xff1a;背景 1.讲故事最近遇到一位朋友的程序崩溃&#xff0c;发现崩溃点在富编辑器 msftedit 上&#xff0c;这个不是重点&#xff0c;重点在于发现他已经开启了 页堆 &#xff0c;看样子是做了最后的挣扎。0:000> !analyze -v EXCEPTION_RECORD: (.exr -1) Except…

Win10笔记本不显示wifi列表

一、问题描述 1、连接有线网络时&#xff0c;只显示连接到的有线网络&#xff0c;而不显示wifi列表 2、不连接有线网络时&#xff0c;同样不显示wifi列表 二、解决方案 1、Win R 打开运行&#xff0c;并输入services.msc 2、回车确定&#xff0c;找到WLAN AutoConfig项&…

《游戏大师Chris Crawford谈互动叙事》一22.1 互动叙事前途无量

本节书摘来异步社区《游戏大师Chris Crawford谈互动叙事》一书中的第22章&#xff0c;第22.1节&#xff0c;作者&#xff1a; 【美】Chris Crawford译者&#xff1a; 方舟 责编&#xff1a; 陈冀康&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。 22.1 互动…

交换两个局部变量Integer的值

反射是很强大的&#xff0c;谁说的final修饰的就不能改变&#xff0c; 通过反射获取成员变量&#xff0c;之后可以取消访问修饰符&#xff0c;也就是说private的也可以访问&#xff0c; 在修改常量&#xff08;final修饰的&#xff09;&#xff0c;之后就可以对其做任何操作了 …

搭建WeApacheb网站服务器

本地yum源安装mkdir /opt/dvd (先用mkdir去根下opt目录下建一个名字叫dvd的目录)mount /dev/sr0 /opt/dvd (用mount命令&#xff0c;挂载光盘设备&#xff08;/dev/sr0&#xff09;,将光盘挂载到刚刚建立的dvd目录下&#xff08;/opt/dvd&#xff09;)写yum源配置文件|-cd…

PHP的构成及生命周期

一、PHP开源源代码下载地址&#xff1a; https://github.com/php/php-src.git 二、PHP的构成 1、目录结构 2、目录分析 &#xff08;1&#xff09;sapi目录是PHP的应用接口层。 &#xff08;2&#xff09;main为php的主要代码&#xff0c;主要是输入/输出、Web通信、PHP框架…

《Adobe After Effects CS6完全剖析》——动画:最重要的是关系

本节书摘来自异步社区《Adobe After Effects CS6完全剖析》一书中的第2章&#xff0c;动画&#xff1a;最重要的是关系&#xff0c;作者 【美】Mark Christiansen&#xff08;马克克里斯琴森&#xff09;&#xff0c;译者 苗玉敏&#xff0c;郭圣路&#xff0c;曹玉臣&#xff…

Oracle即将发布的全新Java垃圾收集器 ZGC

Java 11的特性集合已经确定&#xff0c;其中包含了一些非常棒的特性。新版本提供了一个全新的垃圾回收器ZGC&#xff0c;它由甲骨文开发&#xff0c;承诺在TB级别的堆上实现非常低的停顿时间。在本文中&#xff0c;我们将介绍甲骨文开发ZGC的动机、ZGC的技术概览以及ZGC带来的一…

如何获取 OSS AccessKeyId、AccessKeySecret

开通阿里云oss&#xff1a;https://www.aliyun.com/product/oss 1、点击概览 — AccessKey 注&#xff1a;官方链接 2、出现下图&#xff0c;选择“开始使用子用户Access Key” 3、填写用户名&#xff0c;并点击确定 4、这时会给你的手机发送验证码确定是本人操作&#xff0c;…

【网络爬虫入门02】HTTP客户端库Requests的基本原理与基础应用

【网络爬虫入门02】HTTP客户端库Requests的基本原理与基础应用 广东职业技术学院 欧浩源 2017-10-15 1、引言 实现网络爬虫的第一步就是要建立网络连接并向服务器或网页等网络资源发起请求。urllib是目前最常用的做法&#xff0c;然而Requests会比urlib更加方便&#xff0c;能…

5分钟内看懂机器学习和深度学习的区别

欢迎大家前往腾讯云社区&#xff0c;获取更多腾讯海量技术实践干货哦~ 本文由liuxuewen 发表于云社区专栏 在本文中&#xff0c;我们将研究深度学习和机器学习之间的差异。我们将逐一了解它们&#xff0c;然后讨论他们在各个方面的不同之处。除了深度学习和机器学习的比较外&am…

《零信任的基石:使用 SPIFFE 为基础设施创建通用身份》翻译电子书分享

国庆假期除了去浙江和安徽玩了一圈欣赏江南山水和徽派建筑之外&#xff0c;还抽空翻译了一本电子书。本书译自 Solving the Bottom Turtle — a SPIFFE Way to Establish Trust in Your Infrastructure via Universal Identity。你可以选择在线阅读&#xff08;推荐&#xff09…

《Outlook时间整理术》一创建和使用自己的文件夹结构

本节书摘来异步社区《Outlook时间整理术》一书中的第1章&#xff0c;作者&#xff1a; 【德】Lothar Seiwert , Holger Woeltje 译者&#xff1a; 欧阳宇&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。 创建和使用自己的文件夹结构 花费约两小时为电子邮件…

PHP 使用 OSS上传文件

一、安装阿里云 oss sdk 1、在网站根目录执行下面命令&#xff0c;安装oss sdk。 composer require aliyuncs/oss-sdk-php 安装后&#xff0c;会在 网站根目录/vendor 下找到一个名为 aliyuncs 的文件夹。 注&#xff1a;[阿里云 oss - sdk 文档&#xff08;可不用关注&…

webpack常用配置

1.加载CSS 命令行输入 npm install --save-dev style-loader css-loader webpack.config.js配置如下 const path require(path);module.exports {entry: ./src/index.js,output: {filename: bundle.js,path: path.resolve(__dirname, dist)},module: {rules: [{test: /\.css$…

《实用软件架构:从系统环境到软件部署 》——2.4 架构视图与架构视点

本节书摘来自华章出版社《实用软件架构&#xff1a;从系统环境到软件部署》一书中的第2章&#xff0c;第2.4节&#xff0c;作者&#xff1a;[印]蒂拉克米特拉&#xff08;Tilak Mitra&#xff09;著&#xff0c;爱飞翔 译&#xff0c;更多章节内容可以访问云栖社区“华章计算机…

TCP:当初取代NCP,如今害怕被取代

我叫TCP&#xff08;Transmission Control Protocol&#xff09;也叫传输控制协议。不觉回忆1983年&#xff0c;亲手将NCP协议淘汰&#xff0c;取而代之的是我&#xff0c;成了火遍大江南北的网络红人之一。现如今&#xff0c;我感受到前所未有的恐惧&#xff0c;因为我一生的敌…

js截取字符串实例

// JS截取字符串可使用 substring()或者slice() // // 函数&#xff1a;substring() // 定义&#xff1a;substring(start,end)表示从start到end之间的字符串&#xff0c;包括start位置的字符但是不包括end位置的字符。 // 功能&#xff1a;字符串截取&#xff0c;…

PHP 使用 OSS 批量删除图片

1、控制器 OssImageController.php&#xff08;不必关注此层&#xff09; <?php declare(strict_types 1); namespace app\controllers; use app\services\OssImageService; class OssImageController extends BaseController {/*** oss 批量删除图片** throws null*/pub…

批处理中的IF详解

在CMD使用IF /?打开IF的系统帮助会发现IF有3种基本的用法! 第一种用法&#xff1a;IF [NOT] ERRORLEVEL number command 这种用法现在很少用了&#xff0c;因为它需要使用到CHOICE命令&#xff0c;这个命令现在被set /p代替了&#xff0c;它是判断CHOICE命令选择的选项的&…