結論:例外処理とは「実行中に起きたエラーでプログラムが止まるのを防ぎ、代わりの対応をする」しくみです。書き方はどの言語もほぼ同じで、〈危ないコードを try で囲む → 起きた例外を catch(Python は except)で受け止める〉の2ステップだけ。まずはブラウザでそのまま動かして、止まるコードと止まらないコードを見比べるのが一番早いです。
「try catch って何?」「エラーと例外って違うの?」――プログラミングを始めると必ずぶつかる疑問です。この記事は、例外処理の考え方と try / catch の書き方だけに絞って説明します(エラーメッセージそのものの読み方は別記事にまとめてあるので、そちらへ送ります)。環境構築はいりません。出てくるコードはすべて Become-Coder のレッスンページでそのままブラウザ実行できます。無料・登録不要・日本語です。
そもそも「例外」とは?エラーとの違い
まず言葉を整理します。日常会話では「エラー」も「例外」も同じ意味で使われがちですが、プログラミングでは少しだけ役割が違います。
- エラーは「うまくいかなかった状態」全般を指す広い言葉です。文法の書き間違い(コンパイルエラー)も、実行中の失敗も、まとめてエラーと呼ばれます。
- 例外(exception)は、その中でも「プログラムの実行中に起きた異常」で、しかもプログラムから捕まえて対応できるものを指します。「0で割った」「数字でない文字列を数値に変換しようとした」「無いファイルを開こうとした」などが典型です。
つまり例外処理が扱えるのは「実行中に起きる例外」です。文法ミス(そもそもプログラムが動き出せないエラー)は try / catch では防げません。ここは最初に混同しやすいポイントです。エラーメッセージの種類名の読み分け方は、別記事の エラーメッセージの読み方 で詳しく説明しているので、あわせて読むと理解が早まります。
try / catch の基本:危ない場所を囲んで受け止める
例外処理の骨格は、言語が違ってもほとんど同じ形です。
tryのブロックに「失敗するかもしれない処理」を書く。- そこで例外が起きたら、続きを飛ばして
catch(Python ではexcept) のブロックに処理が移る。 catchで「代わりにどうするか」(メッセージを出す・初期値を使う・やり直す等)を書く。
例外が起きてもプログラム全体は止まらず、catch のあとの処理へ進めるのがポイントです。まずは実際に動かしてみましょう。
Python の try / except
Python では try と except を使います。「数字でない文字列を int() に渡すと ValueError で止まる」――このコードを try で囲むと、止まらずにメッセージを出せます。
詳しくは Python入門コースの「例外処理 ― エラーに備える」 を参照してください。ブラウザ上の実行ボタンでそのまま動かせるので、except の行を消したら本当に止まるのか、なども自分で試せます。
JavaScript の try / catch / throw
JavaScript は try / catch に加えて、自分から例外を起こす throw もセットで学べます。「0で割ろうとしたら自分で例外を投げ、それを catch で受け止める」という一連の流れを1つのコードで体験できます。
詳しくは JavaScript入門コースの「例外処理 ― try / catch / throw」 を参照してください。こちらもブラウザで実行できる回です。
Java / C# の try-catch
Java や C# のような型のはっきりした言語でも、書き方の骨格は同じ try / catch です。C# はとくに例外処理を1章まるごと扱っていて、その章のレッスンはすべてブラウザで実行できます。順番に動かすだけで、基本から設計まで身につきます。
- try-catch で例外を受け止める ― まずはここ。止まるコードが止まらなくなる瞬間を体験
- 例外の種類と catch の絞り込み ―
catchを種類ごとに書き分ける - finally と using ― 成功・失敗どちらでも必ず実行する後片付け
- throw ― 自分で例外を投げる ― 不正な入力をその場で止める
- 独自例外クラスと例外設計 ― 自分のアプリ用の例外を作る
いきなり全部を覚える必要はありません。最初は「44 → 45」だけでも、try / catch の感覚は十分つかめます。
どんな例外が起きる?種類を知っておくと catch しやすい
catch(except)は、受け止めたい例外の種類を指定して書き分けられます。だから「どんな例外があるか」を知っておくほど、狙って受け止められるようになります。代表的なものを言語別に見ておきましょう。
- Python の「0で割った」→ ZeroDivisionError、「型は合うが値が不正」→ ValueError
- C# の「0で割った」→ DivideByZeroException、「null を触った」→ NullReferenceException
- Java の「0で割った」→ ArithmeticException
これらは「1エラー=1ページ」でまとめた逆引きリファレンスの一部です。言語ごとの全体は Pythonのエラー逆引き / C#のエラー逆引き / Javaのエラー逆引き から一覧できます(こちらは読み物形式のリファレンスです)。
初心者がつまずきやすいところ
- 「とりあえず全部 catch」でにぎりつぶす。 例外を受け止めたのに中身を何もせず握りつぶすと、バグが見えなくなります。最低でもメッセージを出す・記録する。何が起きたかは種類名から分かります(→ C#のエラー逆引き)。
- 文法エラーを try / catch で直そうとする。 前述のとおり、そもそも動き出せないエラー(コンパイルエラー)は例外処理では防げません。まずコードを正しく書くのが先です。
- 後片付けを忘れる。 ファイルや接続を開いたまま例外で抜けると、開きっぱなしになります。
finally(C# ならusing)で「成功しても失敗しても必ず閉じる」を書きます(→ finally と using)。
まとめ:まずは1つ、ブラウザで動かす
例外処理は「エラーで止まる → 止まらず対応する」への第一歩です。理屈より、try で囲む前と後で挙動がどう変わるかを目で見るのが一番わかります。使っている(使いたい)言語のレッスンを、いますぐブラウザで動かしてみてください。
次に読む
- Python入門:例外処理 ― エラーに備える ―
try/exceptをブラウザで実行 - JavaScript入門:例外処理 ― try / catch / throw ―
throwまで一気に - C#入門:try-catch で例外を受け止める ― 例外処理の章のはじめ
- エラーメッセージの読み方 ― 出たエラーの種類名を読み分ける
- オブジェクト指向とは?を初心者向けに ― 独自例外クラスの前提になる考え方