例外処理(Exception Handling)

PR
PR

例外処理(Exception Handling)とは、プログラムの実行中に起きた想定外の出来事(例外)を受け止めて、プログラムが突然止まらないように対処する仕組みのことです。ファイルが見つからない、通信が途切れた、ゼロで割り算をしたといった問題が起きたときに、エラーを知らせたり、別の方法でやり直したりできます。

現実世界に例えると、例外処理はサーカスの綱渡りの下に張られた安全ネットのようなものです。足を踏み外しても、ネットが受け止めてくれるので、大けがをせずに演技を立て直せます。

例外とは何か

前提の話です。例外とは、プログラムが通常の流れのまま処理を続けられなくなるような、想定外の出来事のことです。開こうとしたファイルが削除されていた、利用者が数字の欄に文字を入れた、相手のサーバーが応答しない、といったことが代表例です。どれも、プログラム自体に誤りがなくても、実行するときの状況によって起こりえます。

基本の書き方

多くの言語に共通する形です。例外が起きるかもしれない処理を「try」のまとまりに書き、例外が起きたときの対処を「catch」のまとまりに書きます。

キーワード 役割
try 例外が起きるかもしれない処理を書く
catch 例外が起きたときの対処を書く(Pythonではexcept)
finally 例外の有無にかかわらず、最後に必ず行う処理を書く
throw 自分で例外を発生させる(Pythonではraise)

例外処理がないとどうなるか

必要な理由です。例外を受け止める仕組みがないと、多くの場合、プログラムはその場で止まってしまいます。作業中のデータが保存されないまま失われたり、利用者に意味の分からないエラーの画面が表示されたりします。例外処理を書いておけば、「ファイルが見つかりません」と分かりやすく伝えたり、通信をやり直したりと、状況に合った対応ができます。

必ず行う後片付け

finallyの使いどころです。ファイルやデータベースの接続などは、例外が起きた場合でも、使い終わったら必ず閉じる必要があります。finallyのまとまりに閉じる処理を書いておけば、処理がうまくいった場合も、途中で例外が起きた場合も、確実に後片付けが行われます。最近の言語には、範囲を抜けると自動で閉じてくれる専用の書き方も用意されています。

例外は呼び出し元へ伝わる

例外の流れ方です。ある処理の中で起きた例外をその場で受け止めなければ、その処理を呼び出した側へと、順にさかのぼって伝わっていきます。そのため、細かい処理の中では例外を受け止めず、全体を見渡せる上の階層でまとめて対処する、という設計もよく使われます。どこで受け止めるのが適切かを考えることが、例外処理の設計の要です。

やってはいけない書き方

よくある失敗です。例外を受け止めたのに、何もせずに無視してしまう書き方は避けるべきです。エラーが起きた事実が隠れてしまい、後になってデータがおかしくなっていることに気づいても、原因をたどれなくなります。少なくとも、何が起きたかを記録に残すか、上の階層に伝えるようにしておきましょう。また、通常の条件分岐で済む処理に例外を使うのも、読みにくさや処理の遅さにつながります。

言語による違い

仕組みの違いです。Javaには、起きる可能性のある例外への対処を書かないと、プログラムを動かす前の段階でエラーになる種類の例外があります。対処の漏れを防げる反面、書く量が増えるという声もあります。一方、Go言語のように例外の仕組みを主に使わず、処理の結果と一緒にエラーの情報を返して、呼び出した側で確かめる方式をとる言語もあります。

エラーとの違い

言葉の使い分けです。日常的には、例外とエラーはほぼ同じ意味で使われますが、言語によっては区別されています。たとえばJavaでは、プログラムで対処できる問題を「例外」、メモリが足りなくなったなど、プログラムでは立て直せない深刻な問題を「エラー」として分けています。どの問題を受け止め、どの問題はそのまま止めるべきかを見極めることが大切です。

あわせて知っておきたい用語

  • デバッグ:
    プログラムの誤りを見つけて、直す作業です。
  • ログ:
    システムの動きや出来事を、時間の順に記録したものです。
  • バグ:
    プログラムに含まれる誤りや不具合のことです。
  • スタックトレース:
    例外が起きた場所と、そこに至るまでの呼び出しの流れを示す情報です。

コメント

タイトルとURLをコピーしました