実行時エラー(ランタイムエラー)とは?
ランタイムエラー(実行時エラー)とは、プログラムの実行中に、手元の値では処理を実行できないときに起きるエラーのことです。ゼロ除算やリストの末尾を超えた読み取りが典型例です。エラーを処理しない限り、プログラムはその行で停止します。
更新日: 2026年9月24日
実行時エラー(ランタイムエラー)は、プログラムが動き始めてから姿を現します。コードは開始前のチェックをすべて通過し、しばらくは正しく動き、そしてその時点の値では実行できない処理に到達します。次の関数は、あるリストではうまく動き、別のリストでは失敗します。
85.0
Traceback (most recent call last):
File "main.py", line 5, in <module>
print(average([]))
^^^^^^^^^^^
File "main.py", line 2, in average
return sum(scores) / len(scores)
~~~~~~~~~~~~^~~~~~~~~~~~~
ZeroDivisionError: division by zero
1回目の呼び出しは 85.0 を表示します。2回目は空のリストを渡しているので、len(scores) が0になり、割り算ができません。文法にはどこも問題がないので、これは構文エラーではありません。問題は特定のデータのときにだけ存在します。だからこそ、実行時エラーは100回正しく動いたプログラムにも現れることがあるのです。
実行時エラーが起きると何が起こるのか
- プログラムがある処理に到達します。ここでは
sum(scores) / len(scores)です。 - ランタイムは実行する前にその処理をチェックします。CPythonは割り算の前に除数を調べ、JVMは配列のインデックスをすべてチェックし、Pythonは辞書の値を返す前にキーが存在するかを確かめます。
- チェックに失敗すると、ランタイムはエラーオブジェクトを作ります。PythonとJavaではこのオブジェクトが例外で、エラーの種類、メッセージ、発生した場所を記録しています。
- ランタイムはその種類のエラーを処理するコードを探します。まず現在の関数の中、次にその関数を呼び出した関数の中、というように外側へ向かって探します。
- 処理するコードがなければ、プログラムは停止します。Pythonはトレースバックを表示して終了ステータス1で終わります。Javaは
Exception in thread "main"で始まるスタックトレースを表示します。
こうしたチェックがない言語では、振る舞いが異なります。Cは配列のインデックスもポインタもチェックしないので、不正なメモリアクセスは黙ってデータを壊すか、オペレーティングシステムがセグメンテーション違反でプログラムを終了させるかのどちらかになります。
失敗した行より前にプログラムが行ったことは、すべてすでに実行済みです。次のループは3つの色を表示してから、4回目で失敗します。
red
green
blue
Traceback (most recent call last):
File "main.py", line 4, in <module>
print(colors[i])
~~~~~~^^^
IndexError: list index out of range
トレースバックの読み方
Pythonのトレースバックは下から上に読みます。最後の行にはエラーの種類とメッセージが書かれています(ZeroDivisionError: division by zero)。その上の行は呼び出しの連鎖で、古いものが先、最新のものが最後に並びます。最初の例では、5行目が average を呼び出し、average の中の2行目で割り算が失敗しています。
エラーが起きた行が、直すべき行とは限りません。average の2行目は正しいのです。本当の問題は、なぜ空のリストがそこに届いたのかです。おかしな値をその出どころまでたどり、そこで直してください。自分で書いていないライブラリのファイルをトレースバックが通っている場合は、自分のファイルを指している最後の行を探します。
よくある実行時エラー
以下のメッセージはどれもPython 3.12からそのまま写したものです。
| エラー | 例 | メッセージ |
|---|---|---|
ZeroDivisionError | 10 / 0 | division by zero |
IndexError | ["red", "green", "blue"][3] | list index out of range |
KeyError | {"theme": "dark"}["font"] | 'font' |
ValueError | int("twenty") | invalid literal for int() with base 10: 'twenty' |
TypeError | "Total: " + 5 | can only concatenate str (not "int") to str |
AttributeError | None に対して .upper() を呼ぶ | 'NoneType' object has no attribute 'upper' |
FileNotFoundError | open("missing.txt") | [Errno 2] No such file or directory: 'missing.txt' |
RecursionError | 自分自身を永遠に呼び続ける関数 | maximum recursion depth exceeded |
Javaにもそのまま対応するものがあります。ArithmeticException、ArrayIndexOutOfBoundsException、NumberFormatException、NullPointerException などです。誰も捕捉しない整数のゼロ除算は、Javaでは次のように表示されます。
Exception in thread "main" java.lang.ArithmeticException: / by zero
JavaScriptは数値に関しては寛容で、10 / 0 はエラーではなく Infinity になります。失敗するのは、存在しない値を使ったときです。user が undefined のときに user.name を読むと、Node.jsは次のように表示します。
TypeError: Cannot read properties of undefined (reading 'name')
実行時エラーの直し方
- 再現します。同じ入力でプログラムをもう一度実行し、同じエラーが出ることを確認します。
- トレースバックの最後の行を読み、自分のコードの中で対応する行を見つけます。
- 関係する値を調べます。失敗する行の直前で値を表示するか、デバッガのブレークポイントでそこで止めます。
- 原因を直します。インデックスを修正する、特別なケースを先に処理する、使う前に入力を検証する、といった方法です。
average 関数の場合は、スコアが1つもないときの平均をどうするかを決め、それをコードに書くのが修正方法です。
85.0
0
自分ではどうにもできない失敗もあります。削除されたファイル、タイムアウトするネットワーク、数字を入れるべきところに文字を入力するユーザーなどです。こうしたものはコードを直しても防げないので、例外処理で捕捉し、プログラムが次に何をするかを決めます。やってはいけないのは、バグを try で包んで隠すことです。1回多く数えてしまうループから出た IndexError は、捕捉すべきエラーではなく、直すべき誤りです。
WindowsやExcelに出る実行時エラーのメッセージ
この言葉は、自分のコード以外の場面でも目にします。Microsoft Visual C++ Runtime Library というタイトルのWindowsのダイアログに Runtime Error! と表示された場合、C++で書かれたプログラムが致命的なエラーに遭遇し、C++のランタイムがそれを終了させたという意味です。ユーザーとしてはそのコードを変更できないので、プログラムを更新する、Microsoft Visual C++ 再頒布可能パッケージを修復または再インストールする、ゲームであればグラフィックドライバを更新する、といった対処が一般的です。
VBAで書かれたExcelのマクロは、番号付きの実行時エラーを報告します。Run-time error '9': Subscript out of range は、存在しないワークシートや配列の要素をマクロが要求したという意味で、Run-time error '1004' は、ブック、シート、セル範囲に対する操作が失敗したときに出る一般的なエラーです。考え方はPythonと同じで、正しいコードが処理できない値に出会ったということです。
次に読むページ
実行時エラーには2つの仲間がいます。プログラムの開始前に見つかる構文エラーと、メッセージをまったく出さない論理エラーです。クラッシュする代わりに実行時エラーから回復するには、例外処理を読み、続けてPythonの例外とエラーのデバッグのガイドを読んでください。Pythonコースでは、毎回のレッスンでこのようなコードを書いて直していきます。
よくある質問
実行時エラーと構文エラーの違いは?
なぜ実行時エラーが何度も出るのですか?
LeetCodeの「Runtime Error」はどういう意味ですか?
None の値の使用、スタックがあふれるほど深い再帰です。結果ページに表示された失敗した入力を自分で実行し、空の配列、要素1つ、許される最大サイズといった境界ケースを確認してください。実行時エラーと例外は同じものですか?
RuntimeException は特定の例外のグループ、つまり NullPointerException のような非チェック例外の名前でもあります。