例外を処理するコードがいくつかありますが、それが特定の例外である場合にのみ、デバッグモードでのみ特定のことを実行したいと思います。したがって、たとえば:
try:
stuff()
except Exception as e:
if _debug and e is KeyboardInterrupt:
sys.exit()
logging.exception("Normal handling")
そのため、私は単に追加したくありません:
except KeyboardInterrupt:
sys.exit()
このデバッグコードの違いを最小限に抑えようとしているからです
まあ、本当に、あなたはおそらくKeyboardInterrupt
のハンドラーを分離しておくべきです。キーボード割り込みをデバッグモードでのみ処理し、それ以外の場合は飲み込むのはなぜですか?
そうは言っても、isinstance
を使用してオブジェクトのタイプを確認できます。
try:
stuff()
except Exception as e:
if _debug and isinstance(e, KeyboardInterrupt):
sys.exit()
logger.exception("Normal handling")
これはほとんどそれが行われる方法です。
try:
stuff()
except KeyboardInterrupt:
if _debug:
sys.exit()
logging.exception("Normal handling")
except Exception as e:
logging.exception("Normal handling")
最小限の繰り返しがあります。ただし、ゼロではありませんが、最小限です。
「通常の処理」が複数行のコードである場合は、2行のコードの繰り返しを回避する関数を定義できます。
KeyboardInterruptを完全にバブルさせ、最高レベルでトラップする必要があります。
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
sys.exit()
except:
pass
def main():
try:
stuff()
except Exception as e:
logging.exception("Normal handling")
if _debug:
raise e
どうしたの
try:
stuff()
except KeyboardInterrupt:
if _debug:
logging.exception("Debug handling")
sys.exit()
else:
logging.exception("Normal handling")
他の回答に記載されている標準的な方法を使用するか、exceptブロック内で本当にテストしたい場合は、 isinstance() を使用できます。
try:
stuff()
except Exception as e:
if _debug and isinstance(e, KeyboardInterrupt):
sys.exit()
logging.exception("Normal handling")
try:
stuff()
except KeyboardInterrupt:
if _debug:
sys.exit()
logging.exception("Normal handling")
except ValueError:
if _debug:
sys.exit()
logging.exception("Value error Normal handling")
else:
logging.info("One more message without exception")
Pythonで特定の例外に名前を付けることができます。
try:
stuff()
except KeyboardInterrupt:
sys.exit()
except Exception:
normal_handling()