Network Error Wrapper

Construct a NetworkError class that captures issues related to network communications, like failed fetch requests due to network outages.
class NetworkError extends Error {
  constructor(message) {
    // Calls the constructor of the parent Error class.

    // Maintains proper stack trace for where our error was thrown (only available on V8).
    if (Error.captureStackTrace) {
      Error.captureStackTrace(this, NetworkError);

    // A name specific to this class, useful for checking the error type. = 'NetworkError';
This code defines the NetworkError class, a subclass of the JavaScript Error class, which is specifically intended to represent errors related to network operations. It captures a message and sets the error name to 'NetworkError'. Additionally, it ensures that the stack trace is captured correctly in V8-based environments (like Chrome and Node.js).
async function fetchData(url) {
  try {
    // Attempt to fetch data from the provided URL.
    const response = await fetch(url);
    if (!response.ok) {
      // If the response status is not successful, throw a network error.
      throw new NetworkError(`Network Error: The request failed with status ${response.status}`);
    return await response.json(); // Parse and return the response data as JSON.
  } catch (error) {
    if (error instanceof NetworkError) {
      // Handle NetworkError instances specifically.
    } else {
      // Handle other types of errors that may occur.
      console.error('An unexpected error occurred:', error);
    // Re-throw the error for further handling if necessary.
    throw error;
This code snippet provides an example of using the NetworkError class within an async function, named fetchData, which is responsible for fetching data from a given URL using the Fetch API. It handles unsuccessful network requests by throwing a NetworkError with an appropriate message. It also demonstrates how to catch and handle these errors, distinguishing them from other types of JavaScript errors.