function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
force_dev1force_dev1 

BatchApexのexecute内でのExceptionについて

BatchApeを使用した処理を実装しています。

 

finishメソッドでexecuteメソッド内でExceptionが発生したかどうかの

チェックを行いたいと考えていますが、具体的な方法がわかりません。

 

finishメソッド内で下記SOQLを発行してNumberOfErrorsを取得しているのですが

結果は「0」で正常と判断されています。

 

 select
                NumberOfErrors,
                ExtendedStatus
            from
                AsyncApexJob
            where
                Id = :BC.getJobId()

 

ご存知の方がいらっしゃいましたら

ご教授願います。

Best Answer chosen by Admin (Salesforce Developers) 
Mitch OkamotoMitch Okamoto

executeメソッド内でエラーを外までThrowしていますでしょうか?

例えば下記のコードでエラーがメール送信されることを確認できると思います。

 

global class TestBatch implements Database.Batchable<sObject>{

    global Database.querylocator start(Database.BatchableContext BC){
            return Database.getQueryLocator('SELECT Id FROM Account');
    }

    global void execute(Database.BatchableContext BC, List<sObject> scope){
        throw new MyException('test');
    }

    global void finish(Database.BatchableContext BC){
        AsyncApexJob a = [SELECT Id, Status, NumberOfErrors, JobItemsProcessed,
                          TotalJobItems, CreatedBy.Email
                          FROM AsyncApexJob WHERE Id =
                          :BC.getJobId()];
        Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
        mail.setToAddresses(new String[]{'mokamoto@salesforce.com'});
        mail.setReplyTo('noreply@salesforce.com');
        mail.setSenderDisplayName('Batchプロセス');
        mail.setSubject('Batch完了');
        mail.setPlainTextBody('Batch完了しました。エラー' + a.NumberOfErrors +'件');
        Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail });

    }    
    class MyException extends Exception{}
}

 

 

All Answers

Mitch OkamotoMitch Okamoto

executeメソッド内でエラーを外までThrowしていますでしょうか?

例えば下記のコードでエラーがメール送信されることを確認できると思います。

 

global class TestBatch implements Database.Batchable<sObject>{

    global Database.querylocator start(Database.BatchableContext BC){
            return Database.getQueryLocator('SELECT Id FROM Account');
    }

    global void execute(Database.BatchableContext BC, List<sObject> scope){
        throw new MyException('test');
    }

    global void finish(Database.BatchableContext BC){
        AsyncApexJob a = [SELECT Id, Status, NumberOfErrors, JobItemsProcessed,
                          TotalJobItems, CreatedBy.Email
                          FROM AsyncApexJob WHERE Id =
                          :BC.getJobId()];
        Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
        mail.setToAddresses(new String[]{'mokamoto@salesforce.com'});
        mail.setReplyTo('noreply@salesforce.com');
        mail.setSenderDisplayName('Batchプロセス');
        mail.setSubject('Batch完了');
        mail.setPlainTextBody('Batch完了しました。エラー' + a.NumberOfErrors +'件');
        Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail });

    }    
    class MyException extends Exception{}
}

 

 

This was selected as the best answer
force_dev1force_dev1
ご回答いただきありがとうございます。 実行した結果、エラーを取得することができていました。