Skip to main content

Command Palette

Search for a command to run...

Understanding Error Handling in JavaScript

Updated
6 min readView as Markdown
Understanding Error Handling in JavaScript

Errors are a normal part of software development.

No matter how carefully applications are written, unexpected situations always happen.

Examples:

  • Invalid user input

  • API failures

  • Database issues

  • Missing files

  • Undefined variables

  • Network problems

Without proper error handling, applications can crash completely.

JavaScript provides built-in mechanisms to handle these situations gracefully using:

  • try

  • catch

  • finally

  • throw

Understanding error handling is extremely important because it improves:

  • Application stability

  • Debugging

  • User experience

  • Maintainability

In this article, we will understand:

  • What errors are in JavaScript

  • Using try and catch blocks

  • The finally block

  • Throwing custom errors

  • Why error handling matters

  • Real-world debugging concepts


What Are Errors in JavaScript?

Errors occur when JavaScript encounters unexpected situations it cannot handle automatically.

Example:

console.log(user.name);

Output:

ReferenceError: user is not defined

The application throws an error because the variable does not exist.


Understanding Runtime Errors

Some errors happen while the program is running.

These are called runtime errors.

Examples:

  • Accessing undefined variables

  • Calling non-existent functions

  • Invalid JSON parsing

  • API failures

Runtime errors can stop application execution if not handled properly.


Why Error Handling Matters

Without error handling:

Application crashes

With proper error handling:

Application handles failure gracefully

This is extremely important in production systems.


Example Without Error Handling

const data = JSON.parse("invalid json");

console.log(data);

Output:

SyntaxError

Execution stops immediately.


What Is Graceful Failure?

Graceful failure means:

"Application continues working even after errors."

Instead of crashing completely, the application:

  • Detects problems

  • Handles them properly

  • Shows useful messages

  • Continues execution safely

This improves reliability significantly.


Understanding try and catch

JavaScript provides:

  • try

  • catch

to safely handle risky code.

Example:

try {
  const data = JSON.parse("invalid json");

  console.log(data);
} catch (error) {
  console.log("Something went wrong");
}

Output:

Something went wrong

Instead of crashing, the error is handled.


How try and catch Work


try Block

The try block contains code that may produce errors.

Example:

try {
  riskyCode();
}

JavaScript monitors this block for exceptions.


catch Block

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

Example:

catch (error) {
  console.log(error);
}

The error object contains debugging information.


Error Handling Flow

Start try Block
       |
       V
Error Occurs?
   /         \
 Yes          No
  |            |
  V            V
catch Block   Continue

Accessing Error Information

Example:

try {
  JSON.parse("invalid");
} catch (error) {
  console.log(error.message);
}

Output:

Unexpected token i in JSON

The error object provides useful debugging details.


Why catch Is Important

The catch block allows developers to:

  • Prevent crashes

  • Log issues

  • Show user-friendly messages

  • Retry operations

  • Continue execution safely

This is essential for production systems.


Understanding the finally Block

The finally block always executes.

It runs whether:

  • Error occurs

  • No error occurs

Example:

try {
  console.log("Running");
} catch (error) {
  console.log("Error");
} finally {
  console.log("Cleanup");
}

Output:

Running
Cleanup

Try → Catch → Finally Execution Order

try Block
     |
     V
Error?
 /      \
Yes      No
 |        |
 V        V
catch   Skip catch
     \   /
      V V
    finally

The finally block always executes at the end.


Common finally Use Cases

finally is commonly used for cleanup operations.

Examples:

  • Closing database connections

  • Stopping loaders

  • Releasing resources

  • Ending file operations

Example:

try {
  connectDatabase();
} finally {
  closeConnection();
}

Throwing Custom Errors

JavaScript also allows developers to create their own errors.

This is done using:

throw

Basic throw Example

function divide(a, b) {
  if (b === 0) {
    throw new Error("Division by zero is not allowed");
  }

  return a / b;
}

console.log(divide(10, 0));

Output:

Error: Division by zero is not allowed

Why Custom Errors Are Useful

Custom errors make debugging easier because developers can:

  • Create meaningful messages

  • Detect business logic failures

  • Handle specific cases separately

This improves application maintainability.


Real-World Validation Example

Example:

function registerUser(age) {
  if (age < 18) {
    throw new Error("User must be at least 18 years old");
  }

  return "Registration successful";
}

This prevents invalid application states.


Error Object Properties

JavaScript error objects contain useful properties.

Example:

try {
  JSON.parse("invalid");
} catch (error) {
  console.log(error.name);
  console.log(error.message);
}

Output:

SyntaxError
Unexpected token i in JSON

Common JavaScript Error Types

Error Type Meaning
ReferenceError Variable not defined
TypeError Invalid operation on value
SyntaxError Invalid syntax
RangeError Value out of range
Error Generic custom error

Real-World Error Handling Example

API example:

async function fetchData() {
  try {
    const response = await fetch("/api/users");

    const data = await response.json();

    console.log(data);
  } catch (error) {
    console.log("Failed to fetch data");
  } finally {
    console.log("Request completed");
  }
}

This prevents the application from crashing during API failures.


Importance of Debugging

Good error handling improves debugging because developers can:

  • Identify failure points

  • Log detailed information

  • Track application behavior

  • Fix bugs faster

Poor error handling makes debugging difficult.


Common Beginner Mistakes

Empty catch Blocks

Bad example:

catch (error) {

}

Never ignore errors silently.


Throwing Strings Instead of Errors

Bad example:

throw "Something went wrong";

Better:

throw new Error("Something went wrong");

Using try-catch Everywhere

Avoid unnecessary try-catch blocks.

Use them mainly around risky operations.


Common Interview Questions

Difference Between throw and catch

  • throw creates errors

  • catch handles errors


Does finally Always Execute?

Yes, except in very rare termination cases.


Why Use Custom Errors?

To create meaningful business logic validation.


Why Is Error Handling Important?

To prevent crashes and improve debugging.


Real-World Industry Usage

Error handling is critical in:

  • APIs

  • Authentication systems

  • Payment gateways

  • Database operations

  • File uploads

  • Background jobs

Production applications heavily depend on proper exception handling.