1. 正しい JSON の配列なら ok が true になる
  2. 空の配列でも成功として扱う
  3. 途中で切れた JSON は SyntaxError になる
  4. 空文字列でも例外を外に出さない
  5. 配列でないときは自分で TypeError を投げる
コース一覧
モダンJavaScript:データ処理とコード設計
try catch finally

モダンJavaScript:データ処理とコード設計

配列の map・filter・reduce・sort、クロージャと高階関数、オブジェクトとクラス、エラー設計、正規表現を学ぶ全 36 レッスン(665 分)のコースです。ローカルの作品データを題材に、表示とデータを分け、絞り込み・並び替え・入力検証までを組み立てます。Promise、fetch、API 通信、モジュールは次のコースで扱います。

1
土台をそろえる
01. このコースで育てるもの15分
02. strict mode が先に教えてくれる間違い15分
03. 表示とデータを切り分ける20分
04. 第1章まとめクイズ10分
2
配列をパイプラインで扱う
01. map で形を変える20分
02. filter と find で絞り込む20分
03. reduce でひとつにまとめる20分
04. sort と比較関数20分
05. 分類してまとめる groupBy20分
06. つなげて組み立てる20分
07. つくる 作品一覧の絞り込みと並び替え30分
08. 第2章まとめクイズ10分
3
関数を道具にする
01. クロージャで状態を閉じ込める20分
02. 設定を覚えた関数をつくる20分
03. 関数を返す関数20分
04. 副作用のない関数20分
05. 第3章まとめクイズ10分
4
オブジェクトを扱いきる
01. 分割代入で必要な値だけ取り出す20分
02. スプレッドとレストで組み替える20分
03. keys と values と entries20分
04. ビット演算でフラグをまとめる20分
05. 第4章まとめクイズ10分
5
クラスで型をつくる
01. クラスとインスタンス20分
02. private フィールドとアクセサ20分
03. 継承と super20分
04. 多態と static20分
05. つくる 作品コレクションをクラスにする30分
06. 第5章まとめクイズ10分
6
エラーを設計する
01. try catch finally20分
02. 自分でエラーを投げる20分
03. 失敗を画面に出す25分
04. 第6章まとめクイズ10分
7
正規表現
01. 正規表現のきほん20分
02. 入力を検証する20分
03. 置換とキャプチャ20分
04. 第7章まとめクイズ10分

try catch finally

try catch finally の通る順番
解説

このレッスンで分かること

  • try で囲んだ範囲の失敗を catch が受け取り、その先の処理が止まらなくなります
  • finally は成功でも失敗でも必ず走るので、後始末の置き場所になります

1 行の失敗で、下の処理がまとめて止まる

入門で扱った作品データは、自分の手で配列に書いたものでした。自分で書いた配列は形が崩れないので、失敗を考える必要がありませんでした。

実践では、作品データが文字列で外から届きます。途中で切れていることも、配列ではないものが来ることもあります。何も手当てをしていないと、その 1 行で例外が飛びます。

JavaScript

const text = '[{"id":1,"title":"プロフィールサイト"'; const works = JSON.parse(text); console.log("ここには来ない");

例外が飛ぶと、その関数の残りは実行されません。呼び出し元へさかのぼりながら受け止める場所を探し、どこにも無ければページの JavaScript がそこで止まります。作品一覧が出ないだけのつもりが、あいさつも時計もフォームも動かない画面になります。

try で囲み、catch で受け取る

try { } の中で起きた例外は、すぐ下の catch (error) { } が受け取ります。受け取った時点で例外は止まり、catch を抜けたあとの行はふつうに動きます。

JavaScript

try { const works = JSON.parse(text); console.log(works.length); } catch (error) { console.log(error.name); // SyntaxError } console.log("ここには来る");

受け取る error は Error オブジェクトです。中身の使い分けは次のとおりです。

プロパティ中身分岐に使ってよいか
nameエラーの種類の名前使ってよい
message人が読むための説明文使わない
stackどこで起きたかの経路使わない

message の文言は処理系によって違います。同じ壊れた JSON でも、ある環境では「Unexpected end of JSON input」で、別の環境では「JSON Parse error」です。error.message === "..." で分岐を書くと、書いた環境でだけ動くコードになります。種類で分けたいときは name を見ます。

自分で throw した例外も、同じ catch が受け取ります。JSON としては読めるのに中身が期待と違う、という失敗はこれで扱えます。

JavaScript

try { const count = Number("たくさん"); if (Number.isNaN(count)) { throw new TypeError("件数が数値ではありません"); } } catch (error) { console.log(error.name); // TypeError }

finally は必ず走る

finally { } は、try が最後まで通っても catch に落ちても、必ず走ります。読み込み中の表示を消す、押せなくしたボタンを戻すといった、結果に関係なくやることをここに置きます。

JavaScript

function run(text) { try { console.log("1 try"); return JSON.parse(text); } catch (error) { console.log("2 catch"); return null; } finally { console.log("3 finally"); } }

run("[]") は 1、3 の順、run("こわれた") は 1、2、3 の順で出ます。try の中に return があっても、値を返す直前に finally が走ります。だから途中で返す関数の後始末は finally に置くのが確実です。同じ後始末を try の末尾と catch の末尾に 2 回書くと、あとで片方だけ直して片方が残る事故が起きます。

よくある間違い

  • 失敗する行が try の外にある — 囲むのは失敗しうる行です。JSON.parse を外に出したまま、その下の行だけを囲んでも受け止められません。逆に囲みすぎもよくありません。関係のない処理まで入れると、どこで失敗したのかが catch から分からなくなります
  • catch を空にする — 画面は止まらなくなりますが、なぜ何も出ないのかが誰にも分からなくなります。動いているように見えて、失敗したという事実だけが消えます。受け取ったら必ずどこかに残します

要件

  1. safeParseWorks(text) を作り、text は JSON の文字列として受け取る
  2. 戻り値は { ok, works, errorName, finished } の 4 つのキーを持つオブジェクトにする
  3. JSON.parse に成功し、結果が配列なら ok を true、works を解析結果にする
  4. 解析に失敗した場合と結果が配列でない場合は ok を false、works を空配列、errorName に error.name を入れる
  5. finished は成功でも失敗でも true にする。finally を使うこと

入出力例

safeParseWorks("[{"id":1,"title":"プロフィールサイト","category":"site","views":120},{"id":2,"title":"自己紹介カード","category":"card","views":48}]") → {"errorName":null,"finished":true,"ok":true,"works":[{"category":"site","id":1,"title":"プロフィールサイト","views":120},{"category":"card","id":2,"title":"自己紹介カード","views":48}]} safeParseWorks("[]") → {"errorName":null,"finished":true,"ok":true,"works":[]} safeParseWorks("[{"id":1,"title":"プロフィールサイト"") → {"errorName":"SyntaxError","finished":true,"ok":false,"works":[]} safeParseWorks("") → {"errorName":"SyntaxError","finished":true,"ok":false,"works":[]} safeParseWorks("{"id":1,"title":"学習ログ"}") → {"errorName":"TypeError","finished":true,"ok":false,"works":[]}

ヒント

報告用のオブジェクトを先に作り、try の中と catch の中でその中身を書き換えていくと、戻り値の形が 1 つに定まります。

JSON.parse は失敗すると SyntaxError を投げます。配列かどうかは Array.isArray で調べ、違ったら throw new TypeError で自分から投げます。

finished を try と catch の両方に書くと、片方を直し忘れます。finally に 1 回だけ書いてください。

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/03/27·更新 2026/08/26

関連レッスン

  • 自分でエラーを投げる

    throw で処理を止めて呼び出し元に知らせる書き方と、Error を継承した自前のエラークラスで失敗の種類を表す方法を学びます。

  • 失敗を画面に出す

    catch で受け取った失敗をコンソールで終わらせず、決まった場所に文言を出し、次の読み込みで消えるところまで作ります。

  • 第6章まとめクイズ

    try catch finally の走る順番、throw と自前のエラークラス、失敗の伝え方をコードで確かめます。

  • 正規表現のきほん

    文字列を文字ではなく形で探す正規表現を導入します。文字クラスと量指定子を読めるようにして、match で当たった部分を取り出せるようになります。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • 処理計算や代入を表す長方形
  • 配列サイズ固定の同型データの集まり
  • 関数処理に名前を付けて再利用できる単位
  • JavaScriptWeb で動的な振る舞いを担う言語
  • フォームinput(text, email, password, checkbox, radio)、select、textarea、button。
  • オブジェクトキーと値のペアで構造を作るデータ
  • プロパティメソッドを属性のようにアクセスできるようにするデコレータ。
  • applicationJSON 本文を送るときの Content-Type
main.js
学習モード
エディタを読み込んでいます

メモ

try catch finally

⌘S で保存