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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值