You need to sign in to do that
Don't have an account?
JayNic
Avoiding the 'Script Thrown Exception' error message
Hi all,
I have a problem I've not seen until recently.
When I hit save, and throw my own exception: I'm getting a message added to the page: 'Script Thrown Exception'.
This is not a message in the exception that I have made. In addition: it's also adding the desired message from my controller.
Here is what it looks like:
The controller code for the save function is as follows:
COD Exception is a custom exception class I've made:
As well as MessageCodes
On top of all that, according to the documentation: if I use the sObject.AddError method it is supposed to prevent any DML from ocurring. (As referenced here: https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_methods_system_sobject.htm#apex_System_SObject_addError) - however it did not.
If I changed the value in one of my fields to forcibly throw the exception: the DML still occurred. So I had to add the Savepoint and rollback to it... Is this right?
Thanks
I have a problem I've not seen until recently.
When I hit save, and throw my own exception: I'm getting a message added to the page: 'Script Thrown Exception'.
This is not a message in the exception that I have made. In addition: it's also adding the desired message from my controller.
Here is what it looks like:
The controller code for the save function is as follows:
//SAVE public void Save(){ savepoint sp = Database.setSavePoint(); try { for(AutoNumber__c r : AutoNumberRecords){ if(r.Length__c == null || r.Length__c < 1){ CODException e = new CODException(new MessageCodes.MessageCode('AN900','The Length must be greater than 0')); r.Length__c.addError(e); throw e; } if(r.CurrentNumber__c == null || r.CurrentNumber__c < 1){ CODException e = new CODException(new MessageCodes.MessageCode('AN901','The Length must be greater than 0')); r.CurrentNumber__c.addError(e); throw e; } } Update AutoNumberRecords; NextRecordNames = null; } catch (exception e){ ApexPages.addMessages(e); Database.rollback(sp); } }
COD Exception is a custom exception class I've made:
public class CODException extends Exception{ //MESSAGE CODE private MessageCodes.MessageCode MessageCode{get;set;} // ADDITIONAL_MESSAGES //The additional messages stores a list of any information to be appended to an error // These could be from DML Exceptions, or multiple errors private list<string> AdditionalMessages{ get; private set; } //COD CODE //Returns the COD error code public string GetCode(){ return MessageCode != null && MessageCode.Code != null ? MessageCode.Code.toUpperCase() : null; } //COD MESSAGE //Componse a message from what data we have private string GetCODMessage(){ string s = (MessageCode != null && MessageCode.Code != null ? MessageCode.Code : '') + (MessageCode != null && MessageCode.Message != null ? ' - ' + MessageCode.Message: ''); if(AdditionalMessages != null && AdditionalMessages.size() > 0) { for(string am : AdditionalMessages){ s += '<br/>• ' + am; } } return s; } //GET MESSAGE //The overriden GetMessage method from the standard Exception class //This is designed to show all the additional information that our exception // method has in it. It may be augemented over time //I am unaware of how the 'escaping' will work when throwing this, or when using a // standard sObejct.AddError() method with the escape signature passed in public override string GetMessage(){ return GetCODMessage(); } //CONSTRUCTORS //With a MessageCodes.MessageCode and a list of string public CODException(MessageCodes.MessageCode pMessageCode, string[] pAdditionalMessages) { MessageCode = pMessageCode; AdditionalMessages = pAdditionalMessages; } //With a MessageCodes.MessageCode and a set of string public CODException(MessageCodes.MessageCode pMessageCode, set<string> pAdditionalMessages) { this(pMessageCode, new list<string>(pAdditionalMessages)); } //With a MessageCodes.MessageCode and a string public CODException(MessageCodes.MessageCode pMessageCode, string pString) { this(pMessageCode,new string[]{pString}); } //With a MessageCodes.MessageCode public CODException(MessageCodes.MessageCode pMessageCode) { MessageCode = pMessageCode; } //With a MessageCodes.Message code and a DML Exception public CODException(Messagecodes.MessageCode pMessageCode, DMLException pDMLx){ MessageCode = pMessageCode; set<string> s = new set<string>(); for(integer i = 0; i < pDMLx.getNumDML(); i++){ s.add(pDMLx.getDmlMessage(i)); } AdditionalMessages = new list<string>(s); } }
As well as MessageCodes
public class MessageCodes{ ////////// ERROR_AND_MESSAGE_CODES ////////// //A class used to hold all Message codes related to a particular area of the system // Populated by a map of code to message, and retrieved as a case insensitive map.Get() type // of method. //This used to be a listing of enum error codes, but it was discovered that enums will only permit 100 entries // so I deprecated that to this //The class that hold all message codes related to a particular area of the system public MessageCodes.MessageCode Get(string pCode) { MessageCode m; if(pCode != null && pCode.DeleteWhiteSpace() != '' && MessageCodeMap.get(pCode.ToUpperCase().trim()) != null) { m = new MessageCodes.MessageCode(pCode.ToUpperCase().trim(),MessageCodeMap.get(pCode.ToUpperCase().trim())); } return m; } private map<string,string> MessageCodeMap { get { if(MessageCodeMap == null) { MessageCodeMap = new map<string,string>(); } return MessageCodeMap; } private set; } //CONSTRUCTOR //Pass in a map of error code to code message public MessageCodes(map<string,string> pCodeMessages){ for(string s : pCodeMessages.KeySet()){ MessageCodeMap.put(s.ToUpperCase().Trim(),pCodeMessages.get(s)); } } //What is returned after requesting an error message and code public class MessageCode{ public string Code {get;private set;} public string Message {get;private set;} public MessageCode(string pCode, string pMessage){ Code = pCode.ToUpperCase().trim(); Message = pMessage; } } }
On top of all that, according to the documentation: if I use the sObject.AddError method it is supposed to prevent any DML from ocurring. (As referenced here: https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_methods_system_sobject.htm#apex_System_SObject_addError) - however it did not.
If I changed the value in one of my fields to forcibly throw the exception: the DML still occurred. So I had to add the Savepoint and rollback to it... Is this right?
Thanks
You just need to remove or comment below line in your code then this excpetion message will remove "Script-thrown exception".
-Thanks
Ashlekh Gera