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.pswp.cn/news/282170.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282170.shtml
英文地址,請注明出處:http://en.pswp.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命令選擇的選項的&…