web-dev-qa-db-ja.com

python)で特定の例外タイプを処理する

例外を処理するコードがいくつかありますが、それが特定の例外である場合にのみ、デバッグモードでのみ特定のことを実行したいと思います。したがって、たとえば:

try:
    stuff()
except Exception as e:
    if _debug and e is KeyboardInterrupt:
        sys.exit()
    logging.exception("Normal handling")

そのため、私は単に追加したくありません:

except KeyboardInterrupt:
    sys.exit()

このデバッグコードの違いを最小限に抑えようとしているからです

17
Falmarri

まあ、本当に、あなたはおそらくKeyboardInterruptのハンドラーを分離しておくべきです。キーボード割り込みをデバッグモードでのみ処理し、それ以外の場合は飲み込むのはなぜですか?

そうは言っても、isinstanceを使用してオブジェクトのタイプを確認できます。

try:
    stuff()
except Exception as e:
    if _debug and isinstance(e, KeyboardInterrupt):
        sys.exit()
    logger.exception("Normal handling")
22
mipadi

これはほとんどそれが行われる方法です。

try:
    stuff()
except KeyboardInterrupt:
    if _debug:
        sys.exit()
    logging.exception("Normal handling")
except Exception as e:
    logging.exception("Normal handling")

最小限の繰り返しがあります。ただし、ゼロではありませんが、最小限です。

「通常の処理」が複数行のコードである場合は、2行のコードの繰り返しを回避する関数を定義できます。

20
S.Lott

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
1
Paulo Scardine

どうしたの

try:
    stuff()
except KeyboardInterrupt:
    if _debug:
        logging.exception("Debug handling")
        sys.exit()
    else:
        logging.exception("Normal handling")
0
Velociraptors

他の回答に記載されている標準的な方法を使用するか、exceptブロック内で本当にテストしたい場合は、 isinstance() を使用できます。

try:
    stuff()
except Exception as e:
   if _debug and isinstance(e, KeyboardInterrupt):
        sys.exit()
    logging.exception("Normal handling")
0
moinudin
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")
0
Lex

Pythonで特定の例外に名前を付けることができます。

try:
    stuff()
except KeyboardInterrupt:
    sys.exit()
except Exception:
    normal_handling()
0
Chris Pfohl