web-dev-qa-db-ja.com

PythonでKeyErrorをキャッチ

コードを実行した場合:

connection = manager.connect("I2Cx")

I2Cxが存在しないため、プログラムがクラッシュし、KeyErrorが報告されます(I2Cである必要があります)。

しかし、私がそうするなら:

try:
    connection = manager.connect("I2Cx")
except Exception, e:
    print e

Eについては何も出力しません。スローされた例外を出力できるようにしたいと思います。ゼロ除算操作で同じことを試みると、両方の場合に適切にキャッチされ、報告されます。ここで何が欠けていますか?

31
spizzak

メッセージなしでKeyErrorが発生した場合、何も出力されません。もしあなたがそうするなら...

try:
    connection = manager.connect("I2Cx")
except Exception as e:
    print repr(e)

...少なくとも例外クラス名を取得します。

より良い代替方法は、複数のexceptブロックを使用し、処理しようとする例外のみを「キャッチ」することです...

try:
    connection = manager.connect("I2Cx")
except KeyError as e:
    print 'I got a KeyError - reason "%s"' % str(e)
except IndexError as e:
    print 'I got an IndexError - reason "%s"' % str(e)

すべての例外をキャッチする正当な理由がありますが、もしそうするなら、ほとんどの場合例外を再発生する必要があります...

try:
    connection = manager.connect("I2Cx")
except KeyError as e:
    print 'I got a KeyError - reason "%s"' % str(e)
except:
    print 'I got another exception, but I should re-raise'
    raise

...おそらく、ユーザーがCTRL-Cを押した場合はKeyboardInterruptも、SystemExit- blockがsys.exit()を呼び出した場合もtryを処理したくないためです。 。

54
Aya

私はPython 3.6を使用しており、Exceptionとeの間にコンマを使用しても機能しません。

try:
    connection = manager.connect("I2Cx")
except KeyError as e:
    print(e.message)
14
ajpieri

例外からエラーメッセージを取得する方法を確認するには、例外をスローしているライブラリのドキュメントを参照してください。

あるいは、この種のことをデバッグする良い方法は次のように言うことです:

except Exception, e:
    print dir(e)

eのプロパティを確認するには-おそらくmessageプロパティまたは類似のプロパティがあります。

5
RichieHindle

get() を使用することもできます。例:

connection = manager.connect.get("I2Cx")

キーが存在しない場合にKeyErrorを発生させません。

キーが存在しない場合は、2番目の引数を使用してデフォルト値を指定することもできます。

2
kenorb

Print(e.message)を試してください。これは例外を出力できるはずです。

try:
    connection = manager.connect("I2Cx")
except Exception, e:
    print(e.message)
0
Mic

私はpythonにはキャッチがあるとは思わない:)

try:
    connection = manager.connect("I2Cx")
except Exception, e:
    print e
0
Joran Beasley

エラーを処理したくない場合は、NoneTypeだけを使用してget()を使用します。例:

manager.connect.get("")
0
Amrit