PythonでFloatingPointError例外をキャッチする方法【fpectlによる浮動小数点例外の捕捉】
FloatingPointErrorとは
FloatingPointError は、浮動小数点例外制御(fpectl)が有効になっている環境で、浮動小数点演算がエラーとなった際に発生する例外です。
この機能を利用するには、Pythonインタープリタが --with-fpectl フラグを付けてコンパイルされている必要があります。通常のビルドでは無効化されているため、利用前に環境を確認しましょう。
例外を捕捉するサンプルコード
次のコードでは、try-except 構文を使って FloatingPointError を捕捉し、発生した例外の種類(型)を出力しています。
import math
import fpectl
try:
print('Control off:', math.exp(700))
fpectl.turnon_sigfpe()
print('Control on:', math.exp(1000))
except Exception as e:
print(e)
print(type(e))
実行結果
Control off: 1.01423205474e+304 Control on: in math_1 <class 'FloatingPointError'>
コードの解説
math.exp(700) の計算結果は約 1.01×10304 となり、float型の表現範囲(最大約 1.8×10308)に収まるため、正常に実行されます。
一方、fpectl.turnon_sigfpe() で浮動小数点例外のシグナル検出を有効化した後に math.exp(1000) を呼び出すと、計算結果がfloat型の上限を超えてオーバーフローするため、FloatingPointError が送出されます。
except Exception as e: ブロックでは、発生した例外オブジェクトとその型を出力しており、これによってどの種類の例外が発生したのかを簡単に確認できます。
補足:バージョンに関する注意点
fpectl モジュールは特殊な用途向けの機能で、Python 3.7 以降では標準ライブラリから削除されています。また、実際の開発においては、演算前に math.isfinite() などで値の妥当性をチェックしたり、高精度計算が必要な場合は decimal モジュールを活用したりする方法が推奨されます。
-
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の文法上できません。 現実的な回避策:関数へ処理を委譲する この制限に対する実用的な解決策のひとつが、例外が発生しうる部分式の評価を「関数」に委譲する方法です。関数の中