[[📗TDQ-BOSS1 Promiseへの番人]]を乗り越えて次は[[Promise (JavaScript)|Promise]]... といきたいところですが、その前にエラーと例外処理の仕方について学びましょう。 ## Reference - [例外処理 · JavaScript Primer \#jsprimer](https://jsprimer.net/basic/error-try-catch/) ## Lesson ### エラーの送出 意図的にエラーを起こすには [[throw文 (JavaScript)|throw文]] を使います。 ```js function throwError() { throw new Error("エラーを起こします"); } throwError(); ``` `結果` ```error error: Uncaught (in promise) Error: エラーを起こします throw new Error("エラーを起こします"); ^ at throwError (file:///home/tadashi-aikawa/tmp/tdq/main.js:2:9) at file:///home/tadashi-aikawa/tmp/tdq/main.js:5:1 ``` ### エラーハンドリング 発生したエラーを補足してエラーハンドリングするには [[try...catch文 (JavaScript)|try...catch文]] を使います。 ```js try { throw new Error("エラーが発生"); } catch (err) { console.error(err); } ``` ここでは[[例外識別子 (JavaScript)|例外識別子]]を[[console.error]]で出力しているため、エラーメッセージだけでなく[[スタックトレース]]も表示される。 `結果` ```error Error: エラーが発生 at file:///home/tadashi-aikawa/tmp/tdq/main.js:2:9 ``` ## Mission 1 #😁EASY [[try...catch文 (JavaScript)|try...catch文]]で例外をcatchしたあと、[[例外識別子 (JavaScript)|例外識別子]]を[[console.log]]で出力すべきでない理由を説明してください。 %% 解答例 スタックトレースが表示されないから。 %% ## Mission 2 #🙂NORMAL 以下のコードについて ```js function filter(values, predicate) { if (values.length === 0) { throw new Error("filter: valuesの長さが0です"); } return values.filter(predicate); } function filterMap(values, to) { try { return filter(values).map(to); } catch (_) { throw new Error("filterMap: 処理に失敗しました"); } } filterMap([], (x) => x > 3); ``` 実行すると以下のエラーになります。 ```error error: Uncaught (in promise) Error: filterMap: 処理に失敗しました throw new Error("filterMap: 処理に失敗しました"); ^ at filterMap (file:///home/tadashi-aikawa/tmp/tdq/main.js:13:11) at file:///home/tadashi-aikawa/tmp/tdq/main.js:17:1 ``` このコードは `filter` から例外が送出されていますが、そこで生成されたエラーに関する情報が一切出力されていません。この問題を解決してください。 %% 解答例 `filterMap` の [[throw文 (JavaScript)|throw文]] に [[Error.cause (JavaScript)|Error.cause]] を指定します。 ```js function filterMap(values, to) { try { return filter(values).map(to); } catch (err) { throw new Error("filterMap: 処理に失敗しました", { cause: err }); } } ``` %% --- *NEXT* >> [[📗TDQ-022 非同期処理はなぜ生まれたのか]]