1) In my opportunityLineitemtrigger, I have a method which updates the opportunity.

database.saveresult [] rst = database.update(oppList,true);

While updating the opportunity, it calls the before update trigger event of opportunity. In that before update trigger method, I have used an add error method to throw an error message for some of the records which met the criteria

for(Opportunity opp : newList){
                    if(opp.RecordTypeId != SEUtility.getRecordTypeId(SEUtility.OPP_RECTYPE))
                    {       opp.addError(Label.Record_type_not_allowed_to_change);

Once the before update triggers fire with adderror , I dont get anything in database.saveresult in the above code , the debug line system.debug('######'+rst); doesn't gets executed , on checking the logs I see the adderror exception.

Is this is as per salesforce guidelines, since I know when we used database.saveresult it will show the records which got failed and which got succeeded. If for adderror some records failed why cant I get that details in the saveresults.

2) Secondly I see a big error message in RED as

Review all error messages below to correct your data. Apex trigger OpportunityLineItem caused an unexpected exception, contact your administrator: OpportunityLineItem: execution of AfterUpdate caused by: System.DmlException: Update failed. First exception on row 0 with id 0061p0000iuy7AAQ; first error: FIELD_CUSTOM_VALIDATION_EXCEPTION, Fill the values as per the standards: []: Class.OpportunityLineItemTriggerHandler.updatesalesvalue: line 95, column 1

If I am using adderror , it should have been the single line custom error message which i had defined but why so many details shown on UI ?

1 Answer 1

  1. You're passing true as the second parameter (allOrNone) to Database.update(). What you're observing is the documented behavior for that situation:

... using the Database class method, you can specify whether or not to allow for partial record processing if errors are encountered. You can do so by passing an additional second Boolean parameter. If you specify false for this parameter and if a record fails, the remainder of DML operations can still succeed. Also, instead of exceptions, a result object array (or one result object if only one sObject was passed in) is returned containing the status of each operation and any errors encountered. By default, this optional parameter is true, which means that if at least one sObject can’t be processed, all remaining sObjects won’t and an exception will be thrown for the record that causes a failure.

(See DML Statements vs. Database Class Methods)

When you pass true, you get an exception thrown if any record fails, rather than a set of Database.SaveResult records.

  1. The error message essentially gets wrapped in a DmlException which yields this rather user-unfriendly stack trace message. If you want to fix that, you'd need to wrap your DML code at the top level (in your page controller) with a try/catch block and generate a more friendly page message. Alternately, pass false for allOrNone as above, and synthesize a message to the user from the result messages you get back. (See Database.SaveResult)
  • 1
    Damn you're fast. I was halfway through writing the answer. :) Oct 3, 2018 at 20:59
  • As an aside, you can simulate the behavior of allOrNothing by setting a database savepoint before the DML and rolling back to it if the function returns any errors. Another advantage to this is that you can find all the records with errors at once, rather than one at a time. Oct 4, 2018 at 0:04
  • @david: Thanks for your reply. I just have one small query for the second part that is while using try catch I want my custom error message to present instead of the big error stacck tree so after I catch the DMLException, in the catch block I used throw new mycustomexpection('Error Occured'); Public class mycustomexpection extends exception{} In this case also , I got a stack tree about my exception class . Cant that be modified and only 'Error Occurend can be shown on UI'
    – Quddus
    Oct 4, 2018 at 11:13
  • Use ApexPages.addMessage() instead of throwing an exception if you don't want to see a stack trace.
    – David Reed
    Oct 4, 2018 at 11:24
  • in trigger context, i need the same not on vf page
    – Quddus
    Oct 4, 2018 at 18:09

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .