PythonでOverflowError例外をキャッチする方法をわかりやすく解説
算術演算が変数型で扱える上限を超えると、OverflowError(オーバーフロー例外)が発生します。
ここで注意したいのは、整数の扱いです。Pythonの長整数(long)は、値が大きくなるにつれて必要なメモリ領域を自動的に拡張していくため、桁あふれではなくMemoryErrorが発生します。また、通常の整数は必要に応じて自動的にlong型へ変換される仕組みになっています。
その一方で、浮動小数点数の例外処理は標準化されていないため、計算結果が表現可能な範囲を超えた場合にはOverflowErrorが送出されます。この記事では、try-except構文を使ってこのOverflowErrorを捕捉する方法を紹介します。
サンプルコード
以下のコードでは、浮動小数点数を繰り返し2乗していき、オーバーフローが発生した時点で例外をキャッチしてメッセージを表示します。
i = 1
f = 3.0 ** i
try:
for i in range(100):
print(i, f)
f = f ** 2
except OverflowError as err:
print('Overflowed after', f, err)実行結果
このコードを実行すると、浮動小数点数の値がどんどん大きくなり、最終的にOverflowErrorが発生してプログラムが停止します。出力は次のようになります。
Floating point values: 0 3.0 1 9.0 2 81.0 3 6561.0 4 43046721.0 5 1.85302018885e+15 6 3.43368382029e+30 7 1.17901845777e+61 8 1.39008452377e+122 9 1.93233498323e+244 Overflowed after 1.93233498323e+244 (34, 'Result too large')
ポイントまとめ
- 算術演算の結果が変数型の範囲を超えるとOverflowErrorが発生する
- 整数は自動的にlong型へ拡張されるため、極端な場合はMemoryErrorになる
- 浮動小数点数のオーバーフローは標準化されておらず、環境によって挙動が異なる場合がある
- try-except構文で
except OverflowError as err:と書くことで、エラー内容を安全に取得・処理できる
-
PythonでKeyError例外をキャッチする方法をわかりやすく解説
Pythonでは、辞書(dict)に存在しないキーを使って値へアクセスしようとすると、KeyError例外が発生します。この記事では、try-except文を使ってKeyErrorをキャッチし、例外の種類や詳細情報を確認する方法を解説します。 KeyErrorが発生する仕組み 次のコードは、辞書に存在しないキー c で値を取得しようとしているため、KeyErrorが発生します。sys.exc_info() を使うと、発生した例外の型などの情報を取得できます。 import sys try: s = {a: 5, b: 7}[c] except: print(sys.exc_i
-
Pythonのリスト内包表記で例外をキャッチするには?原因と対処法を解説
Pythonには、例外を処理したり無視したりするための組み込み関数は存在しません。そのため、リスト内包表記の中ですべての例外を処理することは不可能です。 その理由は、リスト内包表記が「式(expression)」で構成されている点にあります。例外のキャッチや無視、ハンドリングを行えるのは「文(statement)」である try〜except ブロックだけだからです。式の中に try-except を埋め込むことは、Pythonの文法上できません。 現実的な回避策:関数へ処理を委譲する この制限に対する実用的な解決策のひとつが、例外が発生しうる部分式の評価を「関数」に委譲する方法です。関数の中