Skip to main content

Command Palette

Search for a command to run...

Error Handling in JavaScript: Understanding try, catch, and finally

Updated
4 min read

When writing JavaScript programs, errors are inevitable. These errors can occur due to invalid operations, unexpected inputs, or issues during runtime. Proper error handling allows developers to manage these situations gracefully instead of letting the application crash.

In this article, we will cover:

  • What errors are in JavaScript

  • Using try and catch blocks

  • The finally block

  • Throwing custom errors

  • Why error handling is important


What Are Errors in JavaScript?

An error occurs when something unexpected happens during the execution of a program.

Example:

const user = undefined;

console.log(user.name);

This will produce a runtime error:

TypeError: Cannot read properties of undefined

Another example:

console.log(x);

Output:

ReferenceError: x is not defined

These are called runtime errors, because they occur while the program is running.

Without proper handling, such errors can stop the program completely.


Handling Errors with try and catch

JavaScript provides the try...catch structure to handle errors safely.

Example:

try {
  const user = undefined;
  console.log(user.name);
} catch (error) {
  console.log("An error occurred:", error.message);
}

Explanation:

  • Code inside the try block is executed normally.

  • If an error occurs, execution immediately jumps to the catch block.

  • The catch block receives the error object and allows you to handle it.

Output:

An error occurred: Cannot read properties of undefined

Instead of crashing the program, the error is handled gracefully.


Graceful Failure

Error handling allows programs to fail gracefully, meaning they can recover or provide useful feedback instead of breaking entirely.

Example:

function divide(a, b) {
  try {
    if (b === 0) {
      throw new Error("Division by zero is not allowed");
    }
    return a / b;
  } catch (error) {
    console.log(error.message);
  }
}

divide(10, 0);

Here, the program detects a problem and handles it properly.


The finally Block

The finally block is optional but useful. It runs regardless of whether an error occurs or not.

Example:

try {
  console.log("Processing data...");
} catch (error) {
  console.log("An error occurred");
} finally {
  console.log("Execution completed");
}

Output:

Processing data...
Execution completed

finally is often used for cleanup tasks, such as:

  • Closing files

  • Releasing resources

  • Ending database connections


Throwing Custom Errors

Developers can also create their own errors using the throw statement.

Example:

function checkAge(age) {
  if (age < 18) {
    throw new Error("Access denied: Age must be 18 or older");
  }
  return "Access granted";
}

try {
  console.log(checkAge(16));
} catch (error) {
  console.log(error.message);
}

Output:

Access denied: Age must be 18 or older

Custom errors help developers enforce rules and validate input effectively.


Why Error Handling Matters

Proper error handling is essential for building reliable applications.

Prevents Application Crashes

Without error handling, one small issue can stop the entire program.


Improves Debugging

Error messages help developers quickly identify what went wrong and where the issue occurred.


Enhances User Experience

Instead of showing technical error messages, applications can display user-friendly messages.

Example:

Unable to load data. Please try again later.

Makes Code More Robust

Programs that anticipate and handle errors are more stable and easier to maintain.


Conclusion

Errors are a natural part of programming, but proper error handling allows developers to manage them effectively.

Key points to remember:

  • Errors occur when something unexpected happens during program execution

  • try and catch allow you to safely handle runtime errors

  • finally runs regardless of whether an error occurs

  • Custom errors can be created using throw

  • Proper error handling improves debugging, stability, and user experience

By incorporating error handling into your JavaScript programs, you can create applications that are more reliable, maintainable, and easier to debug.