Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Error Handling

JavaScript provides several built-in error objects, such as Error, TypeError, SyntaxError, and ReferenceError. These objects are thrown when something goes wrong, enabling developers to respond appropriately. However, simply throwing an error isn’t enough; we need to handle them gracefully to keep our applications functional under adverse conditions.

Using try, catch, and finally

The try...catch statement is a common way to handle errors in JavaScript. It allows you to execute a block of code and catch any errors that occur during execution.

try {
  // Code that may throw an error
} catch (error) {
  // Code to handle the error
}

You can also include an optional finally block, which will execute regardless of whether an error was thrown.

try {
  // Code that may throw an error
} catch (error) {
  // Code to handle the error
} finally {
  // Code that will always execute
}

Creating Custom Errors

Sometimes, built-in error types don’t convey enough information. In such cases, you can create custom error classes by extending the Error object.

class MyCustomError extends Error {
  constructor(message) {
    super(message);
    this.name = 'MyCustomError';
  }
}

try {
  throw new MyCustomError('Something went wrong!');
} catch (error) {
  console.error(error.name + ': ' + error.message);
}

Handling Errors with Promises

Promises are widely used for managing asynchronous operations in JavaScript. You can handle errors in Promises using the .catch() method, which is triggered when the Promise is rejected.

fetch('https://api.example.com/data')
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error('Error fetching data:', error));

Handling Errors with async/await

async/await syntax offers a more readable way to work with Promises. Errors in async/await functions are handled using try...catch.

async function fetchData() {
  try {
    const response = await fetch('https://api.example.com/data');
    const data = await response.json();
    console.log(data);
  } catch (error) {
    console.error('Error fetching data:', error);
  }
}

fetchData();

Best Practices for JavaScript Error Handling

  • Use Appropriate Error Types: Utilize built-in error types and create custom errors as needed to make errors more understandable.
  • Avoid Suppressing Errors: Always handle caught errors meaningfully, providing useful information to avoid silent failures.
  • Centralize Error Handling: Consider using a centralized error handling mechanism, such as middleware in Express.js, to maintain consistent error handling across your application.
  • Log Errors Effectively: Log errors with sufficient context to assist in future debugging. Ensure that asynchronous errors are also properly logged.
  • Handle Asynchronous Errors: Ensure that errors in asynchronous code are caught and handled to prevent unhandled rejections and unexpected behaviors.

By following these best practices, you can create more resilient and secure JavaScript applications.