Monday, January 2, 2012

Error handling

Here is simple error handling utility class. With this class it is easy to report errors to the system admin or any User that needs to be kept informed.

To set up for this class add two Boolean fields to your User object.
   Apex_Error_Email__c - set true to indicate this user should receive emails on error.
   Apex_Info_Email__c - set true to indicate this user should receive emails on significant events.

public with sharing class ErrorUtilities {
/* Send email with ERROR message to Users that have custom property Apex_Error_Email__c == true
* Input:  
*    String callerName,  text to identify which piece of code called the method.
*    String errorMessage, the main error message to send
*/
public static void reportError(String callerName, String errorMessage) {
 User[] contacts = [select Id, Name, Email from User
  where Apex_Error_Email__c = true AND IsActive = true];
 report(callerName, contacts,'Error message: ',errorMessage);
}

/* Send email with INFORMATION message to Users that have custom property Apex_Info_Email__c == true
* Input:  
*    String callerName,  text to identify which piece of code called the method.
*    String infoMessage, the main information message to send
*/
public static void reportInfo(String callerName, String infoMessage) {
 User[] contacts = [select Id, Name, Email from User
  where Apex_Info_Email__c = true AND IsActive = true];
 report(callerName, contacts,'Information message: ',infoMessage);
}
 
/*  Compose an error message using the optional Exception and optional reference ID to a Salesforce Object
* 
*/
public static void handleError(System.Exception e, String refId, String callerName, String errorMessage){
 String msg = errorMessage + '\n';
 if(refId != null) {
  String baseURL = URL.getSalesforceBaseUrl().toExternalForm() + '/';
  String refURL = baseURL + refId;
  msg += '\n\n';
  msg += 'See: ' + refURL +'\n'; 
 }
 if(e != null) { 
  msg += '\n';
  msg += 'EXCEPTION:\n  Error: ' + e.getMessage() + '\n';
  msg += '  Type: ' + e.getTypeName() + '\n';
  msg += '  Line Number: ' + e.getLineNumber() + '\n';
  msg += '  Trace:\n' + e.getStackTraceString() + '\n(end stack trace)\n';
 }
 ErrorUtilities.reportError(callerName, msg); 
}

private static void report(String callerName,  User[] contacts, String subjectPrefix,String errorMessage) {
 Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
 
 String[] sendTo = new String[]{};
 for(User aUser : contacts) {
  sendTo.add(aUser.Email);
 }
 
 mail.setToAddresses(sendTo);
 mail.setSubject(subjectPrefix + callerName);
 mail.setPlainTextBody('Message: \n' + errorMessage);
 Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail });
}

public static testmethod void testReportError()
{
 ErrorUtilities.reportError('ErrorUtilities.testReportError', 'This is just a test.');
 ErrorUtilities.reportInfo('ErrorUtilities.testReportError', 'This is just a test.');
 Account sampleAccount = [select Id from Account limit 1];
 ErrorUtilities.handleError(null,sampleAccount.Id,'ErrorUtilities.testReportError','unit testing handle error'); 
 
}
}

No comments:

Post a Comment