While working on salesforce implementation, we should log exception somewhere in our system. This will help in identifying issue as well as we required it for enhancing our current system.
We can use salesforce debug log but this we have check each log record one by one to see some specific apex class issue.
Let us see how to put custom exception logging in salesforce application. Below are steps to create custom logging :-
1. Create Custom Object
2. Create Apex class for Exception logging
3. Use that exception class in your code.
1. Create Custom Object :
Let us create new custom object in our salesforce application. Custom object name and fields details are as below image.
Object Name : CustomException
Fields detail:
Field Name | Field API Name | Type |
---|---|---|
ClassName | ClassName__c | Text(255) |
Exception Message | Exception_Message__c | Long Text Area(32768) |
Exception Type | Exception_Type__c | Text(255) |
Govt Limit in Executing Code | Govt_Limit_in_Executing_Code__c | Long Text Area(32768) |
Line Number | Line_Number__c | Number(18, 0) |
MethodName | MethodName__c | Text(255) |
Related To Number | Related_To_Number__c | Text(255) |
StackTrace | StackTrace__c | Long Text Area(32768) |
2. Create Apex class for Exception
We have to create apex class which will extend Exception class. We will implement our code logic in this class.
Overloaded method LogException with different parameter is created. First method will log any anonymous exception and second method will log exception with record id for which exception is logged.
public class HandleCustomException extends Exception { public static void LogException(Exception e) { LogException(e,''); } // Log Exception in CustomException object. // relatedToId : Case/object for which this error in logged. public static void LogException(Exception e,string relatedToId) { try { String stackTrace = e.getStackTraceString().substringBefore('\n'); String className = stackTrace.substringAfter('.').substringBefore('.'); String methodName = stackTrace.substringBefore(':').substringAfter(className).substringAfter('.'); //Governer Limit of executingQuery String QueryLimit = '1. SOQL Queries used / SOQL Queries allowed: ' + Limits.getQueries() + '/' + Limits.getLimitQueries(); String DMLimit = '2. Number of records queried so far / Number allowed: ' + Limits.getDmlRows() + '/' + Limits.getLimitDmlRows(); String DMLStat = '3. Number of DML statements used so far / Number allowed: ' + Limits.getDmlStatements() + '/' + Limits.getLimitDmlStatements(); String CPUT = '4. Amount of CPU time (in ms) used so far / CPU usage time (in ms) allowed: ' + Limits.getCpuTime() + '/' + Limits.getLimitCpuTime(); //Log information in object CustomException__c exc = new CustomException__c(); exc.Related_To_Number__c=relatedToId; exc.Govt_Limit_in_Executing_Code__c = String.format('{0}\n{1}\n{2}\n{3}',new List<string>{QueryLimit, DMLimit,DMLStat,CPUT}); exc.Exception_Message__c = e.getMessage(); exc.Exception_Type__c = e.getTypeName(); exc.Line_Number__c = e.getLineNumber(); exc.StackTrace__c = e.getStackTraceString(); exc.MethodName__c=methodName; exc.ClassName__c=className; database.insert(exc); } finally{ } } }
3. Use that exception class in your code.
Now our apex class is ready to use in our code to handle custom exceptions. For testing, let us create one test class for above apex.
@isTest public class HandleCustomExceptionTest { @isTest public static void CreateAccount() { try { Account m = new Account(); insert m; } catch (Exception e) { HandleCustomException.LogException(e); } } }
Summary :
if we want to store our application exception, we have to log that in custom object. We can create report/dashboard on that object to see on admin dashboard, so that exception will be tracked.
7 comments
I have a requirement to monitor integration issues in Salesforce. I used above code to capture integration issues but getting errors !invalid.list.init and expecting ‘<' but was: '{ , for the line 'exc.Govt_Limit_in_Executing_Code__c = String.format('{0}\n{1}\n{2}\n{3}',new List{QueryLimit, DMLimit,DMLStat,CPUT});'
Please could you help with this.
Hello Padma,
If format is not working then concatenate these information like QueryLimit+’ ‘+DMLLimit etc or comment that line for testing. If still not working, please connect on telegram or linked-in for 1-2-1 discussion to resolve issue.
Thank You,
Dhanik
Thank you Dhanik!! It’s working now. I have additional requirement to send email with this error message. Please could you help me with this.
I’m getting the same errors !invalid.list.init and expecting ‘<' but was: '{ , for the line 'exc.Govt_Limit_in_Executing_Code__c = String.format('{0}\n{1}\n{2}\n{3}',new List{QueryLimit, DMLimit,DMLStat,CPUT});'
Could you kindly assist and supply the final line that is working to solve this error?
Thank
Hello Randy,
I have updated the code in that line. Please check now.
Thank You,
Dhanik
Hi Dhanik,
How should I use your code in my Class? Is it just to add extends Exception in my apex class for example like below and inside method to use try catch? My requirement is to build Reusable FrameWork for Error Handling. Please help.
Hello,
It is a reusable apex. You can use it in a try-catch block as mentioned in the example. If you have any other use case, let us connect on Linkedin.
Thank You,
Dhanik