JavaScript上級

上級 JavaScriptで学ぶ例外設計|アンチパターン編

導入

例外設計はソフトウェア開発において重要な要素ですが、実際のプロジェクトでは多くのエンジニアが陥りやすいアンチパターンが存在します。特にJavaScriptでは非同期処理が多く、エラー管理が複雑になりがちです。本記事では、具体的なシチュエーションを通じて、典型的な失敗例とその改善策について考察します。

教科書レベルの解説(例外設計)

重要な概念の整理

例外設計は、エラーが発生した際にどのように処理するかを定義するものです。適切なエラーハンドリングは、アプリケーションの信頼性とユーザー体験を向上させます。特にJavaScriptでは、Promiseやasync/awaitを活用することで、非同期処理におけるエラー管理を効果的に行うことが可能です。

コード例(JavaScript)


async function fetchData(url) {
    try {
        const response = await fetch(url);
        if (!response.ok) {
            throw new Error('Network response was not ok');
        }
        const data = await response.json();
        return data;
    } catch (error) {
        console.error('Fetch error:', error);
        throw error; // エラーを再スローすることで上位の処理に通知
    }
}

コードの行ごとの解説

  1. async function fetchData(url) { – 非同期関数を定義し、URLを引数に取る。
  2. try { – エラーハンドリングの開始。
  3. const response = await fetch(url); – 指定したURLからデータを取得。
  4. if (!response.ok) { – レスポンスが正常でない場合のチェック。
  5. throw new Error('Network response was not ok'); – エラーをスローして処理を中断。
  6. const data = await response.json(); – レスポンスをJSON形式に変換。
  7. return data; – 取得したデータを返す。
  8. } catch (error) { – エラーが発生した場合の処理。
  9. console.error('Fetch error:', error); – エラーメッセージをコンソールに出力。
  10. throw error; – エラーを再スローして、上位の呼び出し元に通知。

アンチパターン編

例外設計におけるアンチパターンの一つは、エラーを無視することです。以下のコードは、ネットワークエラーが発生した際に何も処理を行わず、単にコンソールにエラーメッセージを出力するだけのものです。


async function fetchData(url) {
    try {
        const response = await fetch(url);
        if (!response.ok) {
            console.error('Network response was not ok');
        }
        const data = await response.json();
        return data;
    } catch (error) {
        console.error('Fetch error:', error);
    }
}

このコードの問題点は、エラーが発生してもその後の処理が続行される点です。たとえば、データが必要な処理が続行され、未定義のデータに基づいて動作する可能性があります。これを改善するためには、エラーを再スローするか、適切なエラーハンドリングを行い、呼び出し元に通知する必要があります。

まとめ

  • エラーハンドリングを怠ると、アプリケーションの信頼性が低下する。
  • エラーを無視することは、将来的なバグの原因となる。
  • 適切なエラーハンドリングを行うことで、アプリケーションの健全性を保つことができる。