コードを実行した場合:
connection = manager.connect("I2Cx")
I2Cxが存在しないため、プログラムがクラッシュし、KeyErrorが報告されます(I2Cである必要があります)。
しかし、私がそうするなら:
try:
connection = manager.connect("I2Cx")
except Exception, e:
print e
Eについては何も出力しません。スローされた例外を出力できるようにしたいと思います。ゼロ除算操作で同じことを試みると、両方の場合に適切にキャッチされ、報告されます。ここで何が欠けていますか?
メッセージなしで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
を処理したくないためです。 。
私はPython 3.6を使用しており、Exceptionとeの間にコンマを使用しても機能しません。
try:
connection = manager.connect("I2Cx")
except KeyError as e:
print(e.message)
例外からエラーメッセージを取得する方法を確認するには、例外をスローしているライブラリのドキュメントを参照してください。
あるいは、この種のことをデバッグする良い方法は次のように言うことです:
except Exception, e:
print dir(e)
e
のプロパティを確認するには-おそらくmessage
プロパティまたは類似のプロパティがあります。
get()
を使用することもできます。例:
connection = manager.connect.get("I2Cx")
キーが存在しない場合にKeyError
を発生させません。
キーが存在しない場合は、2番目の引数を使用してデフォルト値を指定することもできます。
Print(e.message)を試してください。これは例外を出力できるはずです。
try:
connection = manager.connect("I2Cx")
except Exception, e:
print(e.message)
私はpythonにはキャッチがあるとは思わない:)
try:
connection = manager.connect("I2Cx")
except Exception, e:
print e
エラーを処理したくない場合は、NoneType
だけを使用してget()
を使用します。例:
manager.connect.get("")