How do you handle errors and exceptions in X++?

Rumman Ansari   Software Engineer   2023-05-07   1573 Share
☰ Table of Contents

Table of Content:


How do you handle errors and exceptions in X++?

Handling errors and exceptions in X++ is an important aspect of developing robust and reliable applications. Here are some ways to handle errors and exceptions in X++:

  1. Try-Catch blocks: You can use try-catch blocks to handle exceptions that might be thrown by your code. The try block contains the code that might throw an exception, while the catch block contains the code to handle the exception.
  2. 
    try
    {
     // code that might throw an exception
    }
    catch (Exception::Error)
    {
     // code to handle the exception
     error("An error occurred: %1", Exception::getMessage());
    }
    
  3. The throw statement: You can use the throw statement to throw an exception from your code. This can be useful for signaling that an error has occurred and for providing additional information about the error.
  4. 
    if (someCondition)
    {
     throw error("An error occurred because someCondition is true");
    }
    
  5. The Error class: You can use the Error class to create and throw an exception. The Error class provides several constructors for creating an exception with a specific error message or with additional information about the error.
  6. 
    if (someCondition)
    {
     Error e = new Error("An error occurred because someCondition is true");
     e.addInfo(infoNum(someVariable));
     throw e;
    }
    
  7. Logging: You can use the error(), warning() and info() methods provided by the SysOperation framework, or the EventLog class to log errors and exceptions. This can be useful for tracking and troubleshooting issues that arise in your application.
  8. 
    try
    {
     // code that might throw an exception
    }
    catch (Exception::Error)
    {
     error("An error occurred: %1", Exception::getMessage());
     EventLog::error("An error occurred: %1", Exception::getMessage());
    } 
    

    It's important to properly handle errors and exceptions in your X++ code, to ensure that your application is robust and reliable, and to make it easier to troubleshoot and fix any issues that may arise.

    You can also have

    
    try
    {
      // Code here.
    }
    catch (Exception::Numeric)
    {
      info("Caught a Numeric exception.");
    }
    catch
    {
      info("Caught an exception.");
    }
    finally
    {
      // Executed no matter how the try block exits.
    }
    

    Types of error and exceptions

    You can throw several error exceptions:

    • Break - The user pressed Break or Ctrl + C.
    • CLRError - The error occurred while the CLR functionality was being used.
    • CodeAccessSecurity - An error occurred while the CodeAccessPermission.demand method was being used.
    • DDEerror - An error occurred while the DDE system class was being used.
    • Deadlock - A database deadlock occurred because several transactions are waiting for each other.
    • DuplicateKeyException - An error occurred in a transaction that is using Optimistic Concurrency Control. The transaction can be retried.
    • DuplicateKeyExceptionNotRecovered - An error occurred in a transaction that is using Optimistic Concurrency Control. The code won't be retried, and this exception cannot be caught in a transaction.
    • Error - A fatal error occurred. The transaction has been stopped.
    • Internal - An internal error occurred in the development system.
    • Numeric - An error occurred when the str2intstr2int64, or str2num function was used.
    • UpdateConflict - An error occurred in a transaction during an update.
    • UpdateConflictNotRecovered - An error occurred in a transaction during an update. This exception cannot be retried.
    • TransientSQLConnectionError - An error occurred during the query run. The transaction will be canceled. This exception will not be caught within a transaction.