PythonでStandardError例外をキャッチする方法を解説
Pythonでは、ExceptionクラスがStopIteration、StandardError、Warningなどの基底クラスとなっています。標準のエラーはすべてStandardErrorから派生しており、たとえばArithmeticError、AttributeError、AssertionErrorなどは、この基底クラスを継承した例外です。
AttributeErrorは、属性の参照や代入が失敗したときに発生します。代表的な例として、存在しない属性にアクセスしようとした場合が挙げられます。
以下のコードでは、例外をキャッチし、その種類(型)を確認できるように書き直しています。
コード例
import sys
try:
class Foobar:
def __init__(self):
self.p = 0
f = Foobar()
print(f.p)
print(f.q)
except Exception as e:
print(e)
print(sys.exc_type)
print('This is an example of StandardError exception')実行結果
0 Foobar instance has no attribute 'q' <type 'exceptions.AttributeError'> This is an example of StandardError exception
解説
この例では、オブジェクトfに存在しない属性qへアクセスしているため、AttributeErrorが発生します。try〜exceptブロックによって例外を捕捉し、sys.exc_typeで例外の型を出力することで、これがStandardErrorを基底とする例外であることが確認できます。
注意:Python 3での変更点
上記はPython 2系の挙動に基づいた説明です。Python 3ではStandardErrorクラス自体が廃止され、標準的なエラーは直接Exceptionから派生するように階層が整理されました。そのため、Python 3環境で同様の処理を行う場合は、Exceptionをキャッチするか、より具体的な例外(ここではAttributeError)を指定して捕捉するのが推奨されます。
-
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の文法上できません。 現実的な回避策:関数へ処理を委譲する この制限に対する実用的な解決策のひとつが、例外が発生しうる部分式の評価を「関数」に委譲する方法です。関数の中