Skip to content

11. エラーハンドリング

エラーハンドリングは、JavaScript プログラムを強固にし、予期せぬエラーが発生した際に適切に対処できるようにするための重要な技術です。この章では、エラーハンドリングの基本から、実際に使えるテクニックまでを学びます。

11.1 エラーハンドリングの基本

11.1.1 try...catch 構文

エラーハンドリングの基本は try...catch 構文です。try ブロック内のコードがエラーを出すと、そのエラーは catch ブロックで捕捉され、適切な対処が行われます。

try {
  // エラーが発生する可能性のあるコード
  let result = dangerousFunction();
  console.log(result);
} catch (error) {
  // エラーが発生した場合の処理
  console.error("エラーが発生しました: ", error);
}

11.1.2 finally ブロック

try ブロックか catch ブロックのどちらかが終了すると、オプションで finally ブロックが実行されます。これは、必ず実行したいコードを含める際に便利です。

try {
  let result = dangerousFunction();
  console.log(result);
} catch (error) {
  console.error("エラーが発生しました: ", error);
} finally {
  console.log("このメッセージは、エラーの有無にかかわらず表示されます");
}

11.2 カスタムエラー

JavaScript では独自のエラーを定義し、特定の状況に合わせたエラーハンドリングが可能です。

11.2.1 Error オブジェクトの使用

独自のエラーメッセージを作成するために、Error オブジェクトを使います。

function checkPositiveNumber(number) {
  if (number < 0) {
    throw new Error("Negative numbers are not allowed");
  }
  return true;
}

try {
  checkPositiveNumber(-5);
} catch (error) {
  console.error(error.message);
}

11.2.2 カスタムエラークラスの作成

より複雑なエラーハンドリングを行うために、カスタムエラークラスを作成することもできます。

class NegativeNumberError extends Error {
  constructor(message) {
    super(message);
    this.name = "NegativeNumberError";
  }
}

function checkPositiveNumber(number) {
  if (number < 0) {
    throw new NegativeNumberError("Negative numbers are not allowed");
  }
  return true;
}

try {
  checkPositiveNumber(-5);
} catch (error) {
  if (error instanceof NegativeNumberError) {
    console.error("NegativeNumberError: ", error.message);
  } else {
    console.error("その他のエラー: ", error);
  }
}

11.3 非同期処理におけるエラーハンドリング

JavaScript の非同期処理(例えば、Promise や async/await)にも適切なエラーハンドリングが重要です。

11.3.1 Promise のエラーハンドリング

thencatch を使って Promise のエラーをハンドルします。

function fetchData(url) {
  return fetch(url)
    .then((response) => {
      if (!response.ok) {
        throw new Error("HTTPエラー: " + response.status);
      }
      return response.json();
    })
    .catch((error) => {
      console.error("データ取得中にエラーが発生しました: ", error);
    });
}

fetchData("https://api.example.com/data");

11.3.2 async/await のエラーハンドリング

async/await を使う場合は、try...catch 構文を使います。

async function fetchData(url) {
  try {
    let response = await fetch(url);
    if (!response.ok) {
      throw new Error("HTTPエラー: " + response.status);
    }
    let data = await response.json();
    console.log(data);
  } catch (error) {
    console.error("データ取得中にエラーが発生しました: ", error);
  }
}

fetchData("https://api.example.com/data");

11.3.3 グローバルエラーハンドリング

Promise などの非同期処理で発生した未処理のエラーをグローバルレベルでキャッチする方法もあります。

window.addEventListener("unhandledrejection", (event) => {
  console.error("未処理のPromiseエラー: ", event.reason);
});

11.4 まとめ

エラーハンドリングは、アプリケーションの信頼性を高めるための重要な要素です。try...catch 構文やカスタムエラー、非同期処理におけるエラーハンドリングを理解し、適切に実装することで、堅牢な JavaScript コードを書くことができます。