[[📗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 非同期処理はなぜ生まれたのか]]