Monthly Archives

September 2018

    Exception Logging in Custom Object : Salesforce Apex

    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{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.

    September 8, 2018 0 comment
    0 Facebook Twitter Google + Pinterest