How to Aura Handle multiple DmlExceptionsHow to show exception message in lightning without stacktrace?How to rethrow DmlExceptions as AuraHandledExceptions rightCan I throw an exception in apex and still log the caught exception?Handle exception in managed packageHow to update a field with Lightning Components?fault string: No such parameter param defined for the operation, please check the WSDL for the serviceAura StaticResource Javascript helper classesLockerService and D3 version 4 causing random Promise error in ltng:requireCant catch exception and log to custom object if I throw exceptionDid Salesforce recently update their aura library? Facing weird issues with access control and string concatenationHandle errors in visualforce table with multiple checkboxHow to rethrow DmlExceptions as AuraHandledExceptions right

Why do falling prices hurt debtors?

Have astronauts in space suits ever taken selfies? If so, how?

Did Shadowfax go to Valinor?

Prove that NP is closed under karp reduction?

Example of a continuous function that don't have a continuous extension

LaTeX closing $ signs makes cursor jump

Can an x86 CPU running in real mode be considered to be basically an 8086 CPU?

Why can't I see bouncing of a switch on an oscilloscope?

Fully-Firstable Anagram Sets

Today is the Center

Is it important to consider tone, melody, and musical form while writing a song?

A newer friend of my brother's gave him a load of baseball cards that are supposedly extremely valuable. Is this a scam?

Why are electrically insulating heatsinks so rare? Is it just cost?

Is it possible to do 50 km distance without any previous training?

Arthur Somervell: 1000 Exercises - Meaning of this notation

strToHex ( string to its hex representation as string)

How old can references or sources in a thesis be?

Why was the small council so happy for Tyrion to become the Master of Coin?

The use of multiple foreign keys on same column in SQL Server

Why doesn't H₄O²⁺ exist?

What does CI-V stand for?

How does strength of boric acid solution increase in presence of salicylic acid?

I’m planning on buying a laser printer but concerned about the life cycle of toner in the machine

Why "Having chlorophyll without photosynthesis is actually very dangerous" and "like living with a bomb"?



How to Aura Handle multiple DmlExceptions


How to show exception message in lightning without stacktrace?How to rethrow DmlExceptions as AuraHandledExceptions rightCan I throw an exception in apex and still log the caught exception?Handle exception in managed packageHow to update a field with Lightning Components?fault string: No such parameter param defined for the operation, please check the WSDL for the serviceAura StaticResource Javascript helper classesLockerService and D3 version 4 causing random Promise error in ltng:requireCant catch exception and log to custom object if I throw exceptionDid Salesforce recently update their aura library? Facing weird issues with access control and string concatenationHandle errors in visualforce table with multiple checkboxHow to rethrow DmlExceptions as AuraHandledExceptions right






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;








6















How should I handle multiple DmlException messages when using AuraHandledException inside an Apex Controller.



If I do this:



try 
upsert value;
catch(DmlException e)
throw new AuraHandledException(e.getMessage());
catch(Exception e)
throw new AuraHandledException(e.getMessage());



I get an unfriendly error message, that the users won't like.




System.DmlException: Update failed. First exception on row 0 with id a0220000005vt34AAA; first error: FIELD_CUSTOM_VALIDATION_EXCEPTION: bla bla bla




If I do this:



try 
upsert value;
catch(DmlException e)
throw e;
catch(Exception e)
throw new AuraHandledException(e.getMessage());



I get an unfriendly error message which is even worse:




Unknown Error




If I do this:



try 
upsert value;
catch(DmlException e)
throw new AuraHandledException(e.getDmlMessage(0));
catch(Exception e)
throw new AuraHandledException(e.getMessage());



I only get 1 of the DML errors and there could be many.



On the client-side I am using this JavaScript code to call controller actions and handle errors:



callAction: function (cmp, methodName, params, callback) 
var action = cmp.get(methodName);
action.setParams(params);
action.setCallback(this, function (response)
var state = response.getState();
if (cmp.isValid() && state === 'SUCCESS')
var result = response.getReturnValue();
if (callback) callback(result);
else if (state === 'ERROR')
this.handleErrors(cmp, response.getError());

);
$A.getCallback(function ()
$A.enqueueAction(action);
)();
,
handleErrors: function (cmp, errors)
let toastParams =
title: 'Error',
message: 'Unknown error',
type: 'error'
;
if (errors)
if (errors[0] && errors[0].message)
console.log(errors[0].message);
toastParams.message = errors[0].message;


let toastEvent = $A.get('e.force:showToast');
toastEvent.setParams(toastParams);
toastEvent.fire();
,


I cannot find the defacto solution or framework best practice for handling what must be a common scenario.



Ideally, I'd like a solution which can be used in the Apex controller.



Questions



  1. Is there a capability built into the Lightning framework to handle multiple DmlException's?

  2. Should the JavaScript handle the DmlException rethrow differently?

  3. Do I need to write some custom Apex to handle multiple DmlException's?

--



NOTE: this is not a duplicate of this question because he never got a satisfactory answer.










share|improve this question
























  • Could you not iterate over e.getDmlMessage to throw all errors in a loop or concatenate them?

    – Raul
    2 days ago












  • @Raul obviously I could. I am enquiring to see if there are is a standard platform feature or a high quality solution out there.

    – Robs
    2 days ago












  • I kind of ran into same issue and resorted to regular expression route. salesforce.stackexchange.com/questions/226338/… If the exception is thrown from deep inside helper class or somewhere then AuraHandledException doesn't work as expected and spits out ugly exception.

    – javanoob
    2 days ago






  • 1





    Maybe we can do this all on the client side(JavaScript).

    – itzmukeshy7
    2 days ago

















6















How should I handle multiple DmlException messages when using AuraHandledException inside an Apex Controller.



If I do this:



try 
upsert value;
catch(DmlException e)
throw new AuraHandledException(e.getMessage());
catch(Exception e)
throw new AuraHandledException(e.getMessage());



I get an unfriendly error message, that the users won't like.




System.DmlException: Update failed. First exception on row 0 with id a0220000005vt34AAA; first error: FIELD_CUSTOM_VALIDATION_EXCEPTION: bla bla bla




If I do this:



try 
upsert value;
catch(DmlException e)
throw e;
catch(Exception e)
throw new AuraHandledException(e.getMessage());



I get an unfriendly error message which is even worse:




Unknown Error




If I do this:



try 
upsert value;
catch(DmlException e)
throw new AuraHandledException(e.getDmlMessage(0));
catch(Exception e)
throw new AuraHandledException(e.getMessage());



I only get 1 of the DML errors and there could be many.



On the client-side I am using this JavaScript code to call controller actions and handle errors:



callAction: function (cmp, methodName, params, callback) 
var action = cmp.get(methodName);
action.setParams(params);
action.setCallback(this, function (response)
var state = response.getState();
if (cmp.isValid() && state === 'SUCCESS')
var result = response.getReturnValue();
if (callback) callback(result);
else if (state === 'ERROR')
this.handleErrors(cmp, response.getError());

);
$A.getCallback(function ()
$A.enqueueAction(action);
)();
,
handleErrors: function (cmp, errors)
let toastParams =
title: 'Error',
message: 'Unknown error',
type: 'error'
;
if (errors)
if (errors[0] && errors[0].message)
console.log(errors[0].message);
toastParams.message = errors[0].message;


let toastEvent = $A.get('e.force:showToast');
toastEvent.setParams(toastParams);
toastEvent.fire();
,


I cannot find the defacto solution or framework best practice for handling what must be a common scenario.



Ideally, I'd like a solution which can be used in the Apex controller.



Questions



  1. Is there a capability built into the Lightning framework to handle multiple DmlException's?

  2. Should the JavaScript handle the DmlException rethrow differently?

  3. Do I need to write some custom Apex to handle multiple DmlException's?

--



NOTE: this is not a duplicate of this question because he never got a satisfactory answer.










share|improve this question
























  • Could you not iterate over e.getDmlMessage to throw all errors in a loop or concatenate them?

    – Raul
    2 days ago












  • @Raul obviously I could. I am enquiring to see if there are is a standard platform feature or a high quality solution out there.

    – Robs
    2 days ago












  • I kind of ran into same issue and resorted to regular expression route. salesforce.stackexchange.com/questions/226338/… If the exception is thrown from deep inside helper class or somewhere then AuraHandledException doesn't work as expected and spits out ugly exception.

    – javanoob
    2 days ago






  • 1





    Maybe we can do this all on the client side(JavaScript).

    – itzmukeshy7
    2 days ago













6












6








6


2






How should I handle multiple DmlException messages when using AuraHandledException inside an Apex Controller.



If I do this:



try 
upsert value;
catch(DmlException e)
throw new AuraHandledException(e.getMessage());
catch(Exception e)
throw new AuraHandledException(e.getMessage());



I get an unfriendly error message, that the users won't like.




System.DmlException: Update failed. First exception on row 0 with id a0220000005vt34AAA; first error: FIELD_CUSTOM_VALIDATION_EXCEPTION: bla bla bla




If I do this:



try 
upsert value;
catch(DmlException e)
throw e;
catch(Exception e)
throw new AuraHandledException(e.getMessage());



I get an unfriendly error message which is even worse:




Unknown Error




If I do this:



try 
upsert value;
catch(DmlException e)
throw new AuraHandledException(e.getDmlMessage(0));
catch(Exception e)
throw new AuraHandledException(e.getMessage());



I only get 1 of the DML errors and there could be many.



On the client-side I am using this JavaScript code to call controller actions and handle errors:



callAction: function (cmp, methodName, params, callback) 
var action = cmp.get(methodName);
action.setParams(params);
action.setCallback(this, function (response)
var state = response.getState();
if (cmp.isValid() && state === 'SUCCESS')
var result = response.getReturnValue();
if (callback) callback(result);
else if (state === 'ERROR')
this.handleErrors(cmp, response.getError());

);
$A.getCallback(function ()
$A.enqueueAction(action);
)();
,
handleErrors: function (cmp, errors)
let toastParams =
title: 'Error',
message: 'Unknown error',
type: 'error'
;
if (errors)
if (errors[0] && errors[0].message)
console.log(errors[0].message);
toastParams.message = errors[0].message;


let toastEvent = $A.get('e.force:showToast');
toastEvent.setParams(toastParams);
toastEvent.fire();
,


I cannot find the defacto solution or framework best practice for handling what must be a common scenario.



Ideally, I'd like a solution which can be used in the Apex controller.



Questions



  1. Is there a capability built into the Lightning framework to handle multiple DmlException's?

  2. Should the JavaScript handle the DmlException rethrow differently?

  3. Do I need to write some custom Apex to handle multiple DmlException's?

--



NOTE: this is not a duplicate of this question because he never got a satisfactory answer.










share|improve this question
















How should I handle multiple DmlException messages when using AuraHandledException inside an Apex Controller.



If I do this:



try 
upsert value;
catch(DmlException e)
throw new AuraHandledException(e.getMessage());
catch(Exception e)
throw new AuraHandledException(e.getMessage());



I get an unfriendly error message, that the users won't like.




System.DmlException: Update failed. First exception on row 0 with id a0220000005vt34AAA; first error: FIELD_CUSTOM_VALIDATION_EXCEPTION: bla bla bla




If I do this:



try 
upsert value;
catch(DmlException e)
throw e;
catch(Exception e)
throw new AuraHandledException(e.getMessage());



I get an unfriendly error message which is even worse:




Unknown Error




If I do this:



try 
upsert value;
catch(DmlException e)
throw new AuraHandledException(e.getDmlMessage(0));
catch(Exception e)
throw new AuraHandledException(e.getMessage());



I only get 1 of the DML errors and there could be many.



On the client-side I am using this JavaScript code to call controller actions and handle errors:



callAction: function (cmp, methodName, params, callback) 
var action = cmp.get(methodName);
action.setParams(params);
action.setCallback(this, function (response)
var state = response.getState();
if (cmp.isValid() && state === 'SUCCESS')
var result = response.getReturnValue();
if (callback) callback(result);
else if (state === 'ERROR')
this.handleErrors(cmp, response.getError());

);
$A.getCallback(function ()
$A.enqueueAction(action);
)();
,
handleErrors: function (cmp, errors)
let toastParams =
title: 'Error',
message: 'Unknown error',
type: 'error'
;
if (errors)
if (errors[0] && errors[0].message)
console.log(errors[0].message);
toastParams.message = errors[0].message;


let toastEvent = $A.get('e.force:showToast');
toastEvent.setParams(toastParams);
toastEvent.fire();
,


I cannot find the defacto solution or framework best practice for handling what must be a common scenario.



Ideally, I'd like a solution which can be used in the Apex controller.



Questions



  1. Is there a capability built into the Lightning framework to handle multiple DmlException's?

  2. Should the JavaScript handle the DmlException rethrow differently?

  3. Do I need to write some custom Apex to handle multiple DmlException's?

--



NOTE: this is not a duplicate of this question because he never got a satisfactory answer.







apex lightning-aura-components lightning exception dmlexception






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 2 days ago







Robs

















asked 2 days ago









RobsRobs

2,400642




2,400642












  • Could you not iterate over e.getDmlMessage to throw all errors in a loop or concatenate them?

    – Raul
    2 days ago












  • @Raul obviously I could. I am enquiring to see if there are is a standard platform feature or a high quality solution out there.

    – Robs
    2 days ago












  • I kind of ran into same issue and resorted to regular expression route. salesforce.stackexchange.com/questions/226338/… If the exception is thrown from deep inside helper class or somewhere then AuraHandledException doesn't work as expected and spits out ugly exception.

    – javanoob
    2 days ago






  • 1





    Maybe we can do this all on the client side(JavaScript).

    – itzmukeshy7
    2 days ago

















  • Could you not iterate over e.getDmlMessage to throw all errors in a loop or concatenate them?

    – Raul
    2 days ago












  • @Raul obviously I could. I am enquiring to see if there are is a standard platform feature or a high quality solution out there.

    – Robs
    2 days ago












  • I kind of ran into same issue and resorted to regular expression route. salesforce.stackexchange.com/questions/226338/… If the exception is thrown from deep inside helper class or somewhere then AuraHandledException doesn't work as expected and spits out ugly exception.

    – javanoob
    2 days ago






  • 1





    Maybe we can do this all on the client side(JavaScript).

    – itzmukeshy7
    2 days ago
















Could you not iterate over e.getDmlMessage to throw all errors in a loop or concatenate them?

– Raul
2 days ago






Could you not iterate over e.getDmlMessage to throw all errors in a loop or concatenate them?

– Raul
2 days ago














@Raul obviously I could. I am enquiring to see if there are is a standard platform feature or a high quality solution out there.

– Robs
2 days ago






@Raul obviously I could. I am enquiring to see if there are is a standard platform feature or a high quality solution out there.

– Robs
2 days ago














I kind of ran into same issue and resorted to regular expression route. salesforce.stackexchange.com/questions/226338/… If the exception is thrown from deep inside helper class or somewhere then AuraHandledException doesn't work as expected and spits out ugly exception.

– javanoob
2 days ago





I kind of ran into same issue and resorted to regular expression route. salesforce.stackexchange.com/questions/226338/… If the exception is thrown from deep inside helper class or somewhere then AuraHandledException doesn't work as expected and spits out ugly exception.

– javanoob
2 days ago




1




1





Maybe we can do this all on the client side(JavaScript).

– itzmukeshy7
2 days ago





Maybe we can do this all on the client side(JavaScript).

– itzmukeshy7
2 days ago










3 Answers
3






active

oldest

votes


















3














I would think of using Database.upsert() method which returns Database.UpsertResult[] where error messages can be collected and pass that to AuraHandledException.



You can capture all the errors together which you are facing issues above.



Database methods provide more flexibility that using straight DML statements.



try 
List<String> lstErrorMsg = new List<String>();
Database.UpsertResult[] results = Database.upsert(value,false);
if (results != null)
for (Database.UpsertResult result : results)
if (!result.isSuccess())
Database.Error[] errs = result.getErrors();
for(Database.Error err : errs)

lstErrorMsg.add(err.getMessage());



if(lstErrorMsg.size()>0)
throw new AuraHandledException(lstErrorMsg);


catch (Exception e)
throw new AuraHandledException(e.getMessage());



You can also think of using custom error message comparing the DMLException related errors and show it to the users, because system thrown DMLExceptions are unfriendly user messages.



You could create own framework and Utility classes to handle exceptions and reusing the above script.






share|improve this answer

























  • Thanks for responding and providing a solution. But surely you're not suggesting that everyone include 15 lines of code in every method to handle this? Also, this solution doesn't work if the insert/update is inside business logic which gets used by another part of the system which is not a lightning component, which often is the case i.e. a Service class which is used by a Queuable and InvocableMethod and a Lightning Component

    – Robs
    2 days ago












  • I don't suggest to write 15 lines of code, rather I would prepare to create utility class to use this script as a method. Can you elaborate this line "Also, this solution doesn't work if the insert/update is inside business logic which gets consumed something than a lightning component, which often is the case"? You need to create your own framework to handle relevant exceptions.

    – Santanu Boral
    2 days ago












  • I've updated my previous comment. In-addition: it's not always the case that you are doing the DML action in a controller, so throwing an AuraHandledException deep in your business logic would be bad practice. No offence, but I find this to be a low quality solution/answer to what must be a common problem, so there must be more standardise solutions... I could have whipped together some code the puts the errors into a list...

    – Robs
    2 days ago











  • Also, is the answer a utility class or a custom exception based on DmlException or is there a platform solution or is it something else. If you are suggesting a utility class, why don't you provide one rather than a block of hacked together code which has very little use to the community in the future. Whereas, providing a utility class would help everyone who visits which page in the future...

    – Robs
    2 days ago



















2














These errors we can handle in the JavaScript part, and also for the Apex side as well we can do write some utility methods.



So inside the callback, we can parse the error we got from the server.
For the same, sharing what I do use for the same, feel free to share your thoughts.



AuraBase lightning component and an apex class to handle all the background things parsing the response/errors and also logging errors/exceptions as needed in database/email.



handleErrors: function (c, errors) 
var h = this;

if (errors && Array.isArray(errors))
var errorMessages = [];
errors.forEach(function (error) '';
/* Add more statuses here that you want to parse, if you provide the value then it will show that value directly, instead of parsing the error, else it will format the error and will show to the user. */
var statusCodes =
'CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY': '',
'ENTITY_IS_DELETED': ''
;

var statusKeys = Object.keys(statusCodes);
for (var statusCode = 0, totalCodes = statusKeys.length; statusCode < totalCodes; statusCode++)
try
if (message.indexOf(statusKeys[statusCode]) > -1)
if (!statusCodes[statusKeys[statusCode]])
message = message.split(statusKeys[statusCode] + ', ')[1];
var messageParts = message.split(': ');
if (messageParts.length > 1)
messageParts.pop();

message = messageParts.join(': ');
else
message = statusCodes[statusKeys[statusCode]];

break;

catch (statusCodeException)
break;


errorMessages.push(message);
);

if (errorMessages.length > 0)
h.warning(errorMessages.join(', '), mode: 'sticky' );

else
h.warning('Something went wrong.', mode: 'sticky', title: 'Contact System Administrator!' );




And on the Apex side, we can use try...catch() to handle the exceptions and the JS part will handle all the errors 0/1/N.



try
Integer anError = 1/0;
catch(Exception e)
throw new AuraHandledException(e);






share|improve this answer
































    0














    A purely Apex solution would be to have a AuraHandledExceptionFactory which creates the AuraHandledException with a correctly formatted error message based on the Exception type it was caught.



    Apex Controller



    Simple one line usage



    public with sharing class ApexController 

    @AuraEnabled
    public static String getAction()

    try
    // do something
    catch (Exception cause)
    throw AuraHandledExceptionFactory.create(cause);





    AuraHandledExceptionFactory



    Factory pattern used to generate the aproprate ExceptionHandler based on the type of Exception that has been provided.



    public class AuraHandledExceptionFactory 

    public static AuraHandledException create(Exception cause)
    Type handlerType = getType(cause);
    ExceptionHandler handler = newInstance(handlerType);
    return new AuraHandledException(handler.getMessage(cause));


    private static ExceptionHandler newInstance(Type handlerType)
    try
    return (ExceptionHandler) handlerType.newInstance();
    catch (Exception ignore)
    return new ExceptionHandler();



    private static Type getType(Exception cause)
    return Type.forName(getTypeName(cause));


    private static String getTypeName(Exception cause)
    return cause.getTypeName() + 'Handler';




    ExceptionHandler



    This virtual class can extended for different Exception types



    public virtual class ExceptionHandler 
    public virtual String getMessage(Exception cause)
    return cause.getMessage();




    DmlExceptionHandler



    A custom implementation to handle the DmlException type.



    public class DmlExceptionHandler extends ExceptionHandler 

    public override String getMessage(Exception cause)

    DmlException dml = (DmlException) cause;

    String message = '';

    for(integer index = 0; index < dml.getNumDML(); index++)
    // simple implementation
    message += dml.getDmlMessage(index);

    return message;




    This approach follows the Single Responsibility Principle and the Open-Closed Principle by keeping each class clean and simple, while still enabling you to extend it to handle your own custom exception types.



    Single Responsibility Principle




    The single responsibility principle is that states that every class
    should have responsibility over a single part of the functionality
    provided by the software, and that responsibility should be entirely
    encapsulated by the class.




    Open-Closed Principle




    The open-closed principle states classes should be open for extension,
    but closed for modification; that is, such an entity can allow its
    behaviour to be extended without modifying its source code.







    share|improve this answer

























      Your Answer








      StackExchange.ready(function()
      var channelOptions =
      tags: "".split(" "),
      id: "459"
      ;
      initTagRenderer("".split(" "), "".split(" "), channelOptions);

      StackExchange.using("externalEditor", function()
      // Have to fire editor after snippets, if snippets enabled
      if (StackExchange.settings.snippets.snippetsEnabled)
      StackExchange.using("snippets", function()
      createEditor();
      );

      else
      createEditor();

      );

      function createEditor()
      StackExchange.prepareEditor(
      heartbeatType: 'answer',
      autoActivateHeartbeat: false,
      convertImagesToLinks: false,
      noModals: true,
      showLowRepImageUploadWarning: true,
      reputationToPostImages: null,
      bindNavPrevention: true,
      postfix: "",
      imageUploader:
      brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
      contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
      allowUrls: true
      ,
      onDemand: true,
      discardSelector: ".discard-answer"
      ,immediatelyShowMarkdownHelp:true
      );



      );













      draft saved

      draft discarded


















      StackExchange.ready(
      function ()
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fsalesforce.stackexchange.com%2fquestions%2f256531%2fhow-to-aura-handle-multiple-dmlexceptions%23new-answer', 'question_page');

      );

      Post as a guest















      Required, but never shown

























      3 Answers
      3






      active

      oldest

      votes








      3 Answers
      3






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      3














      I would think of using Database.upsert() method which returns Database.UpsertResult[] where error messages can be collected and pass that to AuraHandledException.



      You can capture all the errors together which you are facing issues above.



      Database methods provide more flexibility that using straight DML statements.



      try 
      List<String> lstErrorMsg = new List<String>();
      Database.UpsertResult[] results = Database.upsert(value,false);
      if (results != null)
      for (Database.UpsertResult result : results)
      if (!result.isSuccess())
      Database.Error[] errs = result.getErrors();
      for(Database.Error err : errs)

      lstErrorMsg.add(err.getMessage());



      if(lstErrorMsg.size()>0)
      throw new AuraHandledException(lstErrorMsg);


      catch (Exception e)
      throw new AuraHandledException(e.getMessage());



      You can also think of using custom error message comparing the DMLException related errors and show it to the users, because system thrown DMLExceptions are unfriendly user messages.



      You could create own framework and Utility classes to handle exceptions and reusing the above script.






      share|improve this answer

























      • Thanks for responding and providing a solution. But surely you're not suggesting that everyone include 15 lines of code in every method to handle this? Also, this solution doesn't work if the insert/update is inside business logic which gets used by another part of the system which is not a lightning component, which often is the case i.e. a Service class which is used by a Queuable and InvocableMethod and a Lightning Component

        – Robs
        2 days ago












      • I don't suggest to write 15 lines of code, rather I would prepare to create utility class to use this script as a method. Can you elaborate this line "Also, this solution doesn't work if the insert/update is inside business logic which gets consumed something than a lightning component, which often is the case"? You need to create your own framework to handle relevant exceptions.

        – Santanu Boral
        2 days ago












      • I've updated my previous comment. In-addition: it's not always the case that you are doing the DML action in a controller, so throwing an AuraHandledException deep in your business logic would be bad practice. No offence, but I find this to be a low quality solution/answer to what must be a common problem, so there must be more standardise solutions... I could have whipped together some code the puts the errors into a list...

        – Robs
        2 days ago











      • Also, is the answer a utility class or a custom exception based on DmlException or is there a platform solution or is it something else. If you are suggesting a utility class, why don't you provide one rather than a block of hacked together code which has very little use to the community in the future. Whereas, providing a utility class would help everyone who visits which page in the future...

        – Robs
        2 days ago
















      3














      I would think of using Database.upsert() method which returns Database.UpsertResult[] where error messages can be collected and pass that to AuraHandledException.



      You can capture all the errors together which you are facing issues above.



      Database methods provide more flexibility that using straight DML statements.



      try 
      List<String> lstErrorMsg = new List<String>();
      Database.UpsertResult[] results = Database.upsert(value,false);
      if (results != null)
      for (Database.UpsertResult result : results)
      if (!result.isSuccess())
      Database.Error[] errs = result.getErrors();
      for(Database.Error err : errs)

      lstErrorMsg.add(err.getMessage());



      if(lstErrorMsg.size()>0)
      throw new AuraHandledException(lstErrorMsg);


      catch (Exception e)
      throw new AuraHandledException(e.getMessage());



      You can also think of using custom error message comparing the DMLException related errors and show it to the users, because system thrown DMLExceptions are unfriendly user messages.



      You could create own framework and Utility classes to handle exceptions and reusing the above script.






      share|improve this answer

























      • Thanks for responding and providing a solution. But surely you're not suggesting that everyone include 15 lines of code in every method to handle this? Also, this solution doesn't work if the insert/update is inside business logic which gets used by another part of the system which is not a lightning component, which often is the case i.e. a Service class which is used by a Queuable and InvocableMethod and a Lightning Component

        – Robs
        2 days ago












      • I don't suggest to write 15 lines of code, rather I would prepare to create utility class to use this script as a method. Can you elaborate this line "Also, this solution doesn't work if the insert/update is inside business logic which gets consumed something than a lightning component, which often is the case"? You need to create your own framework to handle relevant exceptions.

        – Santanu Boral
        2 days ago












      • I've updated my previous comment. In-addition: it's not always the case that you are doing the DML action in a controller, so throwing an AuraHandledException deep in your business logic would be bad practice. No offence, but I find this to be a low quality solution/answer to what must be a common problem, so there must be more standardise solutions... I could have whipped together some code the puts the errors into a list...

        – Robs
        2 days ago











      • Also, is the answer a utility class or a custom exception based on DmlException or is there a platform solution or is it something else. If you are suggesting a utility class, why don't you provide one rather than a block of hacked together code which has very little use to the community in the future. Whereas, providing a utility class would help everyone who visits which page in the future...

        – Robs
        2 days ago














      3












      3








      3







      I would think of using Database.upsert() method which returns Database.UpsertResult[] where error messages can be collected and pass that to AuraHandledException.



      You can capture all the errors together which you are facing issues above.



      Database methods provide more flexibility that using straight DML statements.



      try 
      List<String> lstErrorMsg = new List<String>();
      Database.UpsertResult[] results = Database.upsert(value,false);
      if (results != null)
      for (Database.UpsertResult result : results)
      if (!result.isSuccess())
      Database.Error[] errs = result.getErrors();
      for(Database.Error err : errs)

      lstErrorMsg.add(err.getMessage());



      if(lstErrorMsg.size()>0)
      throw new AuraHandledException(lstErrorMsg);


      catch (Exception e)
      throw new AuraHandledException(e.getMessage());



      You can also think of using custom error message comparing the DMLException related errors and show it to the users, because system thrown DMLExceptions are unfriendly user messages.



      You could create own framework and Utility classes to handle exceptions and reusing the above script.






      share|improve this answer















      I would think of using Database.upsert() method which returns Database.UpsertResult[] where error messages can be collected and pass that to AuraHandledException.



      You can capture all the errors together which you are facing issues above.



      Database methods provide more flexibility that using straight DML statements.



      try 
      List<String> lstErrorMsg = new List<String>();
      Database.UpsertResult[] results = Database.upsert(value,false);
      if (results != null)
      for (Database.UpsertResult result : results)
      if (!result.isSuccess())
      Database.Error[] errs = result.getErrors();
      for(Database.Error err : errs)

      lstErrorMsg.add(err.getMessage());



      if(lstErrorMsg.size()>0)
      throw new AuraHandledException(lstErrorMsg);


      catch (Exception e)
      throw new AuraHandledException(e.getMessage());



      You can also think of using custom error message comparing the DMLException related errors and show it to the users, because system thrown DMLExceptions are unfriendly user messages.



      You could create own framework and Utility classes to handle exceptions and reusing the above script.







      share|improve this answer














      share|improve this answer



      share|improve this answer








      edited 2 days ago

























      answered 2 days ago









      Santanu BoralSantanu Boral

      31.2k52356




      31.2k52356












      • Thanks for responding and providing a solution. But surely you're not suggesting that everyone include 15 lines of code in every method to handle this? Also, this solution doesn't work if the insert/update is inside business logic which gets used by another part of the system which is not a lightning component, which often is the case i.e. a Service class which is used by a Queuable and InvocableMethod and a Lightning Component

        – Robs
        2 days ago












      • I don't suggest to write 15 lines of code, rather I would prepare to create utility class to use this script as a method. Can you elaborate this line "Also, this solution doesn't work if the insert/update is inside business logic which gets consumed something than a lightning component, which often is the case"? You need to create your own framework to handle relevant exceptions.

        – Santanu Boral
        2 days ago












      • I've updated my previous comment. In-addition: it's not always the case that you are doing the DML action in a controller, so throwing an AuraHandledException deep in your business logic would be bad practice. No offence, but I find this to be a low quality solution/answer to what must be a common problem, so there must be more standardise solutions... I could have whipped together some code the puts the errors into a list...

        – Robs
        2 days ago











      • Also, is the answer a utility class or a custom exception based on DmlException or is there a platform solution or is it something else. If you are suggesting a utility class, why don't you provide one rather than a block of hacked together code which has very little use to the community in the future. Whereas, providing a utility class would help everyone who visits which page in the future...

        – Robs
        2 days ago


















      • Thanks for responding and providing a solution. But surely you're not suggesting that everyone include 15 lines of code in every method to handle this? Also, this solution doesn't work if the insert/update is inside business logic which gets used by another part of the system which is not a lightning component, which often is the case i.e. a Service class which is used by a Queuable and InvocableMethod and a Lightning Component

        – Robs
        2 days ago












      • I don't suggest to write 15 lines of code, rather I would prepare to create utility class to use this script as a method. Can you elaborate this line "Also, this solution doesn't work if the insert/update is inside business logic which gets consumed something than a lightning component, which often is the case"? You need to create your own framework to handle relevant exceptions.

        – Santanu Boral
        2 days ago












      • I've updated my previous comment. In-addition: it's not always the case that you are doing the DML action in a controller, so throwing an AuraHandledException deep in your business logic would be bad practice. No offence, but I find this to be a low quality solution/answer to what must be a common problem, so there must be more standardise solutions... I could have whipped together some code the puts the errors into a list...

        – Robs
        2 days ago











      • Also, is the answer a utility class or a custom exception based on DmlException or is there a platform solution or is it something else. If you are suggesting a utility class, why don't you provide one rather than a block of hacked together code which has very little use to the community in the future. Whereas, providing a utility class would help everyone who visits which page in the future...

        – Robs
        2 days ago

















      Thanks for responding and providing a solution. But surely you're not suggesting that everyone include 15 lines of code in every method to handle this? Also, this solution doesn't work if the insert/update is inside business logic which gets used by another part of the system which is not a lightning component, which often is the case i.e. a Service class which is used by a Queuable and InvocableMethod and a Lightning Component

      – Robs
      2 days ago






      Thanks for responding and providing a solution. But surely you're not suggesting that everyone include 15 lines of code in every method to handle this? Also, this solution doesn't work if the insert/update is inside business logic which gets used by another part of the system which is not a lightning component, which often is the case i.e. a Service class which is used by a Queuable and InvocableMethod and a Lightning Component

      – Robs
      2 days ago














      I don't suggest to write 15 lines of code, rather I would prepare to create utility class to use this script as a method. Can you elaborate this line "Also, this solution doesn't work if the insert/update is inside business logic which gets consumed something than a lightning component, which often is the case"? You need to create your own framework to handle relevant exceptions.

      – Santanu Boral
      2 days ago






      I don't suggest to write 15 lines of code, rather I would prepare to create utility class to use this script as a method. Can you elaborate this line "Also, this solution doesn't work if the insert/update is inside business logic which gets consumed something than a lightning component, which often is the case"? You need to create your own framework to handle relevant exceptions.

      – Santanu Boral
      2 days ago














      I've updated my previous comment. In-addition: it's not always the case that you are doing the DML action in a controller, so throwing an AuraHandledException deep in your business logic would be bad practice. No offence, but I find this to be a low quality solution/answer to what must be a common problem, so there must be more standardise solutions... I could have whipped together some code the puts the errors into a list...

      – Robs
      2 days ago





      I've updated my previous comment. In-addition: it's not always the case that you are doing the DML action in a controller, so throwing an AuraHandledException deep in your business logic would be bad practice. No offence, but I find this to be a low quality solution/answer to what must be a common problem, so there must be more standardise solutions... I could have whipped together some code the puts the errors into a list...

      – Robs
      2 days ago













      Also, is the answer a utility class or a custom exception based on DmlException or is there a platform solution or is it something else. If you are suggesting a utility class, why don't you provide one rather than a block of hacked together code which has very little use to the community in the future. Whereas, providing a utility class would help everyone who visits which page in the future...

      – Robs
      2 days ago






      Also, is the answer a utility class or a custom exception based on DmlException or is there a platform solution or is it something else. If you are suggesting a utility class, why don't you provide one rather than a block of hacked together code which has very little use to the community in the future. Whereas, providing a utility class would help everyone who visits which page in the future...

      – Robs
      2 days ago














      2














      These errors we can handle in the JavaScript part, and also for the Apex side as well we can do write some utility methods.



      So inside the callback, we can parse the error we got from the server.
      For the same, sharing what I do use for the same, feel free to share your thoughts.



      AuraBase lightning component and an apex class to handle all the background things parsing the response/errors and also logging errors/exceptions as needed in database/email.



      handleErrors: function (c, errors) 
      var h = this;

      if (errors && Array.isArray(errors))
      var errorMessages = [];
      errors.forEach(function (error) '';
      /* Add more statuses here that you want to parse, if you provide the value then it will show that value directly, instead of parsing the error, else it will format the error and will show to the user. */
      var statusCodes =
      'CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY': '',
      'ENTITY_IS_DELETED': ''
      ;

      var statusKeys = Object.keys(statusCodes);
      for (var statusCode = 0, totalCodes = statusKeys.length; statusCode < totalCodes; statusCode++)
      try
      if (message.indexOf(statusKeys[statusCode]) > -1)
      if (!statusCodes[statusKeys[statusCode]])
      message = message.split(statusKeys[statusCode] + ', ')[1];
      var messageParts = message.split(': ');
      if (messageParts.length > 1)
      messageParts.pop();

      message = messageParts.join(': ');
      else
      message = statusCodes[statusKeys[statusCode]];

      break;

      catch (statusCodeException)
      break;


      errorMessages.push(message);
      );

      if (errorMessages.length > 0)
      h.warning(errorMessages.join(', '), mode: 'sticky' );

      else
      h.warning('Something went wrong.', mode: 'sticky', title: 'Contact System Administrator!' );




      And on the Apex side, we can use try...catch() to handle the exceptions and the JS part will handle all the errors 0/1/N.



      try
      Integer anError = 1/0;
      catch(Exception e)
      throw new AuraHandledException(e);






      share|improve this answer





























        2














        These errors we can handle in the JavaScript part, and also for the Apex side as well we can do write some utility methods.



        So inside the callback, we can parse the error we got from the server.
        For the same, sharing what I do use for the same, feel free to share your thoughts.



        AuraBase lightning component and an apex class to handle all the background things parsing the response/errors and also logging errors/exceptions as needed in database/email.



        handleErrors: function (c, errors) 
        var h = this;

        if (errors && Array.isArray(errors))
        var errorMessages = [];
        errors.forEach(function (error) '';
        /* Add more statuses here that you want to parse, if you provide the value then it will show that value directly, instead of parsing the error, else it will format the error and will show to the user. */
        var statusCodes =
        'CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY': '',
        'ENTITY_IS_DELETED': ''
        ;

        var statusKeys = Object.keys(statusCodes);
        for (var statusCode = 0, totalCodes = statusKeys.length; statusCode < totalCodes; statusCode++)
        try
        if (message.indexOf(statusKeys[statusCode]) > -1)
        if (!statusCodes[statusKeys[statusCode]])
        message = message.split(statusKeys[statusCode] + ', ')[1];
        var messageParts = message.split(': ');
        if (messageParts.length > 1)
        messageParts.pop();

        message = messageParts.join(': ');
        else
        message = statusCodes[statusKeys[statusCode]];

        break;

        catch (statusCodeException)
        break;


        errorMessages.push(message);
        );

        if (errorMessages.length > 0)
        h.warning(errorMessages.join(', '), mode: 'sticky' );

        else
        h.warning('Something went wrong.', mode: 'sticky', title: 'Contact System Administrator!' );




        And on the Apex side, we can use try...catch() to handle the exceptions and the JS part will handle all the errors 0/1/N.



        try
        Integer anError = 1/0;
        catch(Exception e)
        throw new AuraHandledException(e);






        share|improve this answer



























          2












          2








          2







          These errors we can handle in the JavaScript part, and also for the Apex side as well we can do write some utility methods.



          So inside the callback, we can parse the error we got from the server.
          For the same, sharing what I do use for the same, feel free to share your thoughts.



          AuraBase lightning component and an apex class to handle all the background things parsing the response/errors and also logging errors/exceptions as needed in database/email.



          handleErrors: function (c, errors) 
          var h = this;

          if (errors && Array.isArray(errors))
          var errorMessages = [];
          errors.forEach(function (error) '';
          /* Add more statuses here that you want to parse, if you provide the value then it will show that value directly, instead of parsing the error, else it will format the error and will show to the user. */
          var statusCodes =
          'CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY': '',
          'ENTITY_IS_DELETED': ''
          ;

          var statusKeys = Object.keys(statusCodes);
          for (var statusCode = 0, totalCodes = statusKeys.length; statusCode < totalCodes; statusCode++)
          try
          if (message.indexOf(statusKeys[statusCode]) > -1)
          if (!statusCodes[statusKeys[statusCode]])
          message = message.split(statusKeys[statusCode] + ', ')[1];
          var messageParts = message.split(': ');
          if (messageParts.length > 1)
          messageParts.pop();

          message = messageParts.join(': ');
          else
          message = statusCodes[statusKeys[statusCode]];

          break;

          catch (statusCodeException)
          break;


          errorMessages.push(message);
          );

          if (errorMessages.length > 0)
          h.warning(errorMessages.join(', '), mode: 'sticky' );

          else
          h.warning('Something went wrong.', mode: 'sticky', title: 'Contact System Administrator!' );




          And on the Apex side, we can use try...catch() to handle the exceptions and the JS part will handle all the errors 0/1/N.



          try
          Integer anError = 1/0;
          catch(Exception e)
          throw new AuraHandledException(e);






          share|improve this answer















          These errors we can handle in the JavaScript part, and also for the Apex side as well we can do write some utility methods.



          So inside the callback, we can parse the error we got from the server.
          For the same, sharing what I do use for the same, feel free to share your thoughts.



          AuraBase lightning component and an apex class to handle all the background things parsing the response/errors and also logging errors/exceptions as needed in database/email.



          handleErrors: function (c, errors) 
          var h = this;

          if (errors && Array.isArray(errors))
          var errorMessages = [];
          errors.forEach(function (error) '';
          /* Add more statuses here that you want to parse, if you provide the value then it will show that value directly, instead of parsing the error, else it will format the error and will show to the user. */
          var statusCodes =
          'CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY': '',
          'ENTITY_IS_DELETED': ''
          ;

          var statusKeys = Object.keys(statusCodes);
          for (var statusCode = 0, totalCodes = statusKeys.length; statusCode < totalCodes; statusCode++)
          try
          if (message.indexOf(statusKeys[statusCode]) > -1)
          if (!statusCodes[statusKeys[statusCode]])
          message = message.split(statusKeys[statusCode] + ', ')[1];
          var messageParts = message.split(': ');
          if (messageParts.length > 1)
          messageParts.pop();

          message = messageParts.join(': ');
          else
          message = statusCodes[statusKeys[statusCode]];

          break;

          catch (statusCodeException)
          break;


          errorMessages.push(message);
          );

          if (errorMessages.length > 0)
          h.warning(errorMessages.join(', '), mode: 'sticky' );

          else
          h.warning('Something went wrong.', mode: 'sticky', title: 'Contact System Administrator!' );




          And on the Apex side, we can use try...catch() to handle the exceptions and the JS part will handle all the errors 0/1/N.



          try
          Integer anError = 1/0;
          catch(Exception e)
          throw new AuraHandledException(e);







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited 2 days ago









          Robs

          2,400642




          2,400642










          answered 2 days ago









          itzmukeshy7itzmukeshy7

          2,4641123




          2,4641123





















              0














              A purely Apex solution would be to have a AuraHandledExceptionFactory which creates the AuraHandledException with a correctly formatted error message based on the Exception type it was caught.



              Apex Controller



              Simple one line usage



              public with sharing class ApexController 

              @AuraEnabled
              public static String getAction()

              try
              // do something
              catch (Exception cause)
              throw AuraHandledExceptionFactory.create(cause);





              AuraHandledExceptionFactory



              Factory pattern used to generate the aproprate ExceptionHandler based on the type of Exception that has been provided.



              public class AuraHandledExceptionFactory 

              public static AuraHandledException create(Exception cause)
              Type handlerType = getType(cause);
              ExceptionHandler handler = newInstance(handlerType);
              return new AuraHandledException(handler.getMessage(cause));


              private static ExceptionHandler newInstance(Type handlerType)
              try
              return (ExceptionHandler) handlerType.newInstance();
              catch (Exception ignore)
              return new ExceptionHandler();



              private static Type getType(Exception cause)
              return Type.forName(getTypeName(cause));


              private static String getTypeName(Exception cause)
              return cause.getTypeName() + 'Handler';




              ExceptionHandler



              This virtual class can extended for different Exception types



              public virtual class ExceptionHandler 
              public virtual String getMessage(Exception cause)
              return cause.getMessage();




              DmlExceptionHandler



              A custom implementation to handle the DmlException type.



              public class DmlExceptionHandler extends ExceptionHandler 

              public override String getMessage(Exception cause)

              DmlException dml = (DmlException) cause;

              String message = '';

              for(integer index = 0; index < dml.getNumDML(); index++)
              // simple implementation
              message += dml.getDmlMessage(index);

              return message;




              This approach follows the Single Responsibility Principle and the Open-Closed Principle by keeping each class clean and simple, while still enabling you to extend it to handle your own custom exception types.



              Single Responsibility Principle




              The single responsibility principle is that states that every class
              should have responsibility over a single part of the functionality
              provided by the software, and that responsibility should be entirely
              encapsulated by the class.




              Open-Closed Principle




              The open-closed principle states classes should be open for extension,
              but closed for modification; that is, such an entity can allow its
              behaviour to be extended without modifying its source code.







              share|improve this answer





























                0














                A purely Apex solution would be to have a AuraHandledExceptionFactory which creates the AuraHandledException with a correctly formatted error message based on the Exception type it was caught.



                Apex Controller



                Simple one line usage



                public with sharing class ApexController 

                @AuraEnabled
                public static String getAction()

                try
                // do something
                catch (Exception cause)
                throw AuraHandledExceptionFactory.create(cause);





                AuraHandledExceptionFactory



                Factory pattern used to generate the aproprate ExceptionHandler based on the type of Exception that has been provided.



                public class AuraHandledExceptionFactory 

                public static AuraHandledException create(Exception cause)
                Type handlerType = getType(cause);
                ExceptionHandler handler = newInstance(handlerType);
                return new AuraHandledException(handler.getMessage(cause));


                private static ExceptionHandler newInstance(Type handlerType)
                try
                return (ExceptionHandler) handlerType.newInstance();
                catch (Exception ignore)
                return new ExceptionHandler();



                private static Type getType(Exception cause)
                return Type.forName(getTypeName(cause));


                private static String getTypeName(Exception cause)
                return cause.getTypeName() + 'Handler';




                ExceptionHandler



                This virtual class can extended for different Exception types



                public virtual class ExceptionHandler 
                public virtual String getMessage(Exception cause)
                return cause.getMessage();




                DmlExceptionHandler



                A custom implementation to handle the DmlException type.



                public class DmlExceptionHandler extends ExceptionHandler 

                public override String getMessage(Exception cause)

                DmlException dml = (DmlException) cause;

                String message = '';

                for(integer index = 0; index < dml.getNumDML(); index++)
                // simple implementation
                message += dml.getDmlMessage(index);

                return message;




                This approach follows the Single Responsibility Principle and the Open-Closed Principle by keeping each class clean and simple, while still enabling you to extend it to handle your own custom exception types.



                Single Responsibility Principle




                The single responsibility principle is that states that every class
                should have responsibility over a single part of the functionality
                provided by the software, and that responsibility should be entirely
                encapsulated by the class.




                Open-Closed Principle




                The open-closed principle states classes should be open for extension,
                but closed for modification; that is, such an entity can allow its
                behaviour to be extended without modifying its source code.







                share|improve this answer



























                  0












                  0








                  0







                  A purely Apex solution would be to have a AuraHandledExceptionFactory which creates the AuraHandledException with a correctly formatted error message based on the Exception type it was caught.



                  Apex Controller



                  Simple one line usage



                  public with sharing class ApexController 

                  @AuraEnabled
                  public static String getAction()

                  try
                  // do something
                  catch (Exception cause)
                  throw AuraHandledExceptionFactory.create(cause);





                  AuraHandledExceptionFactory



                  Factory pattern used to generate the aproprate ExceptionHandler based on the type of Exception that has been provided.



                  public class AuraHandledExceptionFactory 

                  public static AuraHandledException create(Exception cause)
                  Type handlerType = getType(cause);
                  ExceptionHandler handler = newInstance(handlerType);
                  return new AuraHandledException(handler.getMessage(cause));


                  private static ExceptionHandler newInstance(Type handlerType)
                  try
                  return (ExceptionHandler) handlerType.newInstance();
                  catch (Exception ignore)
                  return new ExceptionHandler();



                  private static Type getType(Exception cause)
                  return Type.forName(getTypeName(cause));


                  private static String getTypeName(Exception cause)
                  return cause.getTypeName() + 'Handler';




                  ExceptionHandler



                  This virtual class can extended for different Exception types



                  public virtual class ExceptionHandler 
                  public virtual String getMessage(Exception cause)
                  return cause.getMessage();




                  DmlExceptionHandler



                  A custom implementation to handle the DmlException type.



                  public class DmlExceptionHandler extends ExceptionHandler 

                  public override String getMessage(Exception cause)

                  DmlException dml = (DmlException) cause;

                  String message = '';

                  for(integer index = 0; index < dml.getNumDML(); index++)
                  // simple implementation
                  message += dml.getDmlMessage(index);

                  return message;




                  This approach follows the Single Responsibility Principle and the Open-Closed Principle by keeping each class clean and simple, while still enabling you to extend it to handle your own custom exception types.



                  Single Responsibility Principle




                  The single responsibility principle is that states that every class
                  should have responsibility over a single part of the functionality
                  provided by the software, and that responsibility should be entirely
                  encapsulated by the class.




                  Open-Closed Principle




                  The open-closed principle states classes should be open for extension,
                  but closed for modification; that is, such an entity can allow its
                  behaviour to be extended without modifying its source code.







                  share|improve this answer















                  A purely Apex solution would be to have a AuraHandledExceptionFactory which creates the AuraHandledException with a correctly formatted error message based on the Exception type it was caught.



                  Apex Controller



                  Simple one line usage



                  public with sharing class ApexController 

                  @AuraEnabled
                  public static String getAction()

                  try
                  // do something
                  catch (Exception cause)
                  throw AuraHandledExceptionFactory.create(cause);





                  AuraHandledExceptionFactory



                  Factory pattern used to generate the aproprate ExceptionHandler based on the type of Exception that has been provided.



                  public class AuraHandledExceptionFactory 

                  public static AuraHandledException create(Exception cause)
                  Type handlerType = getType(cause);
                  ExceptionHandler handler = newInstance(handlerType);
                  return new AuraHandledException(handler.getMessage(cause));


                  private static ExceptionHandler newInstance(Type handlerType)
                  try
                  return (ExceptionHandler) handlerType.newInstance();
                  catch (Exception ignore)
                  return new ExceptionHandler();



                  private static Type getType(Exception cause)
                  return Type.forName(getTypeName(cause));


                  private static String getTypeName(Exception cause)
                  return cause.getTypeName() + 'Handler';




                  ExceptionHandler



                  This virtual class can extended for different Exception types



                  public virtual class ExceptionHandler 
                  public virtual String getMessage(Exception cause)
                  return cause.getMessage();




                  DmlExceptionHandler



                  A custom implementation to handle the DmlException type.



                  public class DmlExceptionHandler extends ExceptionHandler 

                  public override String getMessage(Exception cause)

                  DmlException dml = (DmlException) cause;

                  String message = '';

                  for(integer index = 0; index < dml.getNumDML(); index++)
                  // simple implementation
                  message += dml.getDmlMessage(index);

                  return message;




                  This approach follows the Single Responsibility Principle and the Open-Closed Principle by keeping each class clean and simple, while still enabling you to extend it to handle your own custom exception types.



                  Single Responsibility Principle




                  The single responsibility principle is that states that every class
                  should have responsibility over a single part of the functionality
                  provided by the software, and that responsibility should be entirely
                  encapsulated by the class.




                  Open-Closed Principle




                  The open-closed principle states classes should be open for extension,
                  but closed for modification; that is, such an entity can allow its
                  behaviour to be extended without modifying its source code.








                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited yesterday

























                  answered 2 days ago









                  RobsRobs

                  2,400642




                  2,400642



























                      draft saved

                      draft discarded
















































                      Thanks for contributing an answer to Salesforce Stack Exchange!


                      • Please be sure to answer the question. Provide details and share your research!

                      But avoid


                      • Asking for help, clarification, or responding to other answers.

                      • Making statements based on opinion; back them up with references or personal experience.

                      To learn more, see our tips on writing great answers.




                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function ()
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fsalesforce.stackexchange.com%2fquestions%2f256531%2fhow-to-aura-handle-multiple-dmlexceptions%23new-answer', 'question_page');

                      );

                      Post as a guest















                      Required, but never shown





















































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown

































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown







                      Popular posts from this blog

                      Àrd-bhaile Cathair chruinne/Baile mòr cruinne | Artagailean ceangailte | Clàr-taice na seòladaireachd

                      Cannot Extend partition with GParted The 2019 Stack Overflow Developer Survey Results Are In Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 17/18, 2019 at 00:00UTC (8:00pm US/Eastern) 2019 Community Moderator Election ResultsCan't increase partition size with GParted?GParted doesn't recognize the unallocated space after my current partitionWhat is the best way to add unallocated space located before to Ubuntu 12.04 partition with GParted live?I can't figure out how to extend my Arch home partition into free spaceGparted Linux Mint 18.1 issueTrying to extend but swap partition is showing as Unknown in Gparted, shows proper from fdiskRearrange partitions in gparted to extend a partitionUnable to extend partition even though unallocated space is next to it using GPartedAllocate free space to root partitiongparted: how to merge unallocated space with a partition

                      대한민국 목차 국명 지리 역사 정치 국방 경제 사회 문화 국제 순위 관련 항목 각주 외부 링크 둘러보기 메뉴북위 37° 34′ 08″ 동경 126° 58′ 36″ / 북위 37.568889° 동경 126.976667°  / 37.568889; 126.976667ehThe Korean Repository문단을 편집문단을 편집추가해Clarkson PLC 사Report for Selected Countries and Subjects-Korea“Human Development Index and its components: P.198”“http://www.law.go.kr/%EB%B2%95%EB%A0%B9/%EB%8C%80%ED%95%9C%EB%AF%BC%EA%B5%AD%EA%B5%AD%EA%B8%B0%EB%B2%95”"한국은 국제법상 한반도 유일 합법정부 아니다" - 오마이뉴스 모바일Report for Selected Countries and Subjects: South Korea격동의 역사와 함께한 조선일보 90년 : 조선일보 인수해 혁신시킨 신석우, 임시정부 때는 '대한민국' 국호(國號) 정해《우리가 몰랐던 우리 역사: 나라 이름의 비밀을 찾아가는 역사 여행》“남북 공식호칭 ‘남한’‘북한’으로 쓴다”“Corea 대 Korea, 누가 이긴 거야?”국내기후자료 - 한국[김대중 前 대통령 서거] 과감한 구조개혁 'DJ노믹스'로 최단기간 환란극복 :: 네이버 뉴스“이라크 "韓-쿠르드 유전개발 MOU 승인 안해"(종합)”“해외 우리국민 추방사례 43%가 일본”차기전차 K2'흑표'의 세계 최고 전력 분석, 쿠키뉴스 엄기영, 2007-03-02두산인프라, 헬기잡는 장갑차 'K21'...내년부터 공급, 고뉴스 이대준, 2008-10-30과거 내용 찾기mk 뉴스 - 구매력 기준으로 보면 한국 1인당 소득 3만弗과거 내용 찾기"The N-11: More Than an Acronym"Archived조선일보 최우석, 2008-11-01Global 500 2008: Countries - South Korea“몇년째 '시한폭탄'... 가계부채, 올해는 터질까”가구당 부채 5000만원 처음 넘어서“‘빚’으로 내몰리는 사회.. 위기의 가계대출”“[경제365] 공공부문 부채 급증…800조 육박”“"소득 양극화 다소 완화...불평등은 여전"”“공정사회·공생발전 한참 멀었네”iSuppli,08年2QのDRAMシェア・ランキングを発表(08/8/11)South Korea dominates shipbuilding industry | Stock Market News & Stocks to Watch from StraightStocks한국 자동차 생산, 3년 연속 세계 5위자동차수출 '현대-삼성 웃고 기아-대우-쌍용은 울고' 과거 내용 찾기동반성장위 창립 1주년 맞아Archived"중기적합 3개업종 합의 무시한 채 선정"李대통령, 사업 무분별 확장 소상공인 생계 위협 질타삼성-LG, 서민업종인 빵·분식사업 잇따라 철수상생은 뒷전…SSM ‘몸집 불리기’ 혈안Archived“경부고속도에 '아시안하이웨이' 표지판”'철의 실크로드' 앞서 '말(言)의 실크로드'부터, 프레시안 정창현, 2008-10-01“'서울 지하철은 안전한가?'”“서울시 “올해 안에 모든 지하철역 스크린도어 설치””“부산지하철 1,2호선 승강장 안전펜스 설치 완료”“전교조, 정부 노조 통계서 처음 빠져”“[Weekly BIZ] 도요타 '제로 이사회'가 리콜 사태 불러들였다”“S Korea slams high tuition costs”““정치가 여론 양극화 부채질… 합리주의 절실””“〈"`촛불집회'는 민주주의의 질적 변화 상징"〉”““촛불집회가 민주주의 왜곡 초래””“국민 65%, "한국 노사관계 대립적"”“한국 국가경쟁력 27위‥노사관계 '꼴찌'”“제대로 형성되지 않은 대한민국 이념지형”“[신년기획-갈등의 시대] 갈등지수 OECD 4위…사회적 손실 GDP 27% 무려 300조”“2012 총선-대선의 키워드는 '국민과 소통'”“한국 삶의 질 27위, 2000년과 2008년 연속 하위권 머물러”“[해피 코리아] 행복점수 68점…해외 평가선 '낙제점'”“한국 어린이·청소년 행복지수 3년 연속 OECD ‘꼴찌’”“한국 이혼율 OECD중 8위”“[통계청] 한국 이혼율 OECD 4위”“오피니언 [이렇게 생각한다] `부부의 날` 에 돌아본 이혼율 1위 한국”“Suicide Rates by Country, Global Health Observatory Data Repository.”“1. 또 다른 차별”“오피니언 [편집자에게] '왕따'와 '패거리 정치' 심리는 닮은꼴”“[미래한국리포트] 무한경쟁에 빠진 대한민국”“대학생 98% "외모가 경쟁력이라는 말 동의"”“특급호텔 웨딩·200만원대 유모차… "남보다 더…" 호화病, 고질병 됐다”“[스트레스 공화국] ① 경쟁사회, 스트레스 쌓인다”““매일 30여명 자살 한국, 의사보다 무속인에…””“"자살 부르는 '우울증', 환자 중 85% 치료 안 받아"”“정신병원을 가다”“대한민국도 ‘묻지마 범죄’,안전지대 아니다”“유엔 "학생 '성적 지향'에 따른 차별 금지하라"”“유엔아동권리위원회 보고서 및 번역본 원문”“고졸 성공스토리 담은 '제빵왕 김탁구' 드라마 나온다”“‘빛 좋은 개살구’ 고졸 취업…실습 대신 착취”원본 문서“정신건강, 사회적 편견부터 고쳐드립니다”‘소통’과 ‘행복’에 목 마른 사회가 잠들어 있던 ‘심리학’ 깨웠다“[포토] 사유리-곽금주 교수의 유쾌한 심리상담”“"올해 한국인 평균 영화관람횟수 세계 1위"(종합)”“[게임연중기획] 게임은 문화다-여가활동 1순위 게임”“영화속 ‘영어 지상주의’ …“왠지 씁쓸한데””“2월 `신문 부수 인증기관` 지정..방송법 후속작업”“무료신문 성장동력 ‘차별성’과 ‘갈등해소’”대한민국 국회 법률지식정보시스템"Pew Research Center's Religion & Public Life Project: South Korea"“amp;vwcd=MT_ZTITLE&path=인구·가구%20>%20인구총조사%20>%20인구부문%20>%20 총조사인구(2005)%20>%20전수부문&oper_YN=Y&item=&keyword=종교별%20인구& amp;lang_mode=kor&list_id= 2005년 통계청 인구 총조사”원본 문서“한국인이 좋아하는 취미와 운동 (2004-2009)”“한국인이 좋아하는 취미와 운동 (2004-2014)”Archived“한국, `부분적 언론자유국' 강등〈프리덤하우스〉”“국경없는기자회 "한국, 인터넷감시 대상국"”“한국, 조선산업 1위 유지(S. Korea Stays Top Shipbuilding Nation) RZD-Partner Portal”원본 문서“한국, 4년 만에 ‘선박건조 1위’”“옛 마산시,인터넷속도 세계 1위”“"한국 초고속 인터넷망 세계1위"”“인터넷·휴대폰 요금, 외국보다 훨씬 비싸”“한국 관세행정 6년 연속 세계 '1위'”“한국 교통사고 사망자 수 OECD 회원국 중 2위”“결핵 후진국' 한국, 환자가 급증한 이유는”“수술은 신중해야… 자칫하면 생명 위협”대한민국분류대한민국의 지도대한민국 정부대표 다국어포털대한민국 전자정부대한민국 국회한국방송공사about korea and information korea브리태니커 백과사전(한국편)론리플래닛의 정보(한국편)CIA의 세계 정보(한국편)마리암 부디아 (Mariam Budia),『한국: 하늘이 내린 한 폭의 그림』, 서울: 트랜스라틴 19호 (2012년 3월)대한민국ehehehehehehehehehehehehehehWorldCat132441370n791268020000 0001 2308 81034078029-6026373548cb11863345f(데이터)00573706ge128495