We must handle error properly while writing a piece of logic in Salesforce. In case of error, we can capture error logs and throw error as well.
Problem: If we try to insert logger before throwing error, logger record is not created because its roll backed because of exception throwing even if we use future for inserting logger.
Solution:
We will use platform event in this case.
- We will create Platform Event using ‘Publish Behavior’ as ‘Publish Immediately’. Then we will publish this platform event before exception throwing. This event will get published always because of publish immediate behavior.
- Now we will be writing trigger on Platform Event which will create logger as soon as event is published.
Code Sample:
Method to publish platform event message-
public without sharing class LoggerHandler {
public static void publishErrorLogs(string errorExp) {
List<Logger_Event__e> platformEventObj = new List<Logger_Event__e>();
platformEventObj.add(new Logger_Event__e( Log_Info__c = errorExp ));
List<Database.SaveResult> results = EventBus.publish(platformEventObj);
for (Database.SaveResult sr : results) {
if (sr.isSuccess()) {
System.debug('Successfully published error log event'+ errorExp);
}
else {
for(Database.Error err : sr.getErrors()) {
System.debug('Error returned: ' + err.getStatusCode() +' - ' + err.getMessage());
}
}
}
}
}
Trigger to handle platform event message and create logger-
trigger LoggerEventTrigger on Logger_Event__e (after insert) {
List<Logger__c> portalPackageObjList = new List<Logger__c>();
for (Logger_Event__e event : Trigger.New) {
Logger__c loggerObj = new Logger__c();
loggerObj.Message__c = event.Log_Info__c;
portalPackageObjList.add(loggerObj);
}
if (portalPackageObjList.size() > 0) {
insert portalPackageObjList;
}
}
Now, throwing error and using above publishErrorLogs method to publish event which will create logger using above trigger-
public void calculateAmount() {
try {
//complex logic to process records and calculate amount
} catch (Exception e) {
string errorMsg ='Info: '+ e.getMessage() + ' Error Trace: '+ e.getStackTraceString();
LoggerHandler.publishErrorLogs(errorMsg);
throw new CustomException('Please check Portal Package Logger for more info');
}
}