33

Pythonで、「すべての」例外をキャッチする最良の方法は何ですか?

except: # do stuff with sys.exc_info()[1]

except BaseException as exc:

except Exception as exc:

キャッチはスレッドで実行されている可能性があります。

私の目的は、プロセスの終了などを示すものなど、特別な Python 例外をマスクせずに、通常のコードによってスローされる可能性のある例外をログに記録することです。

例外へのハンドルを取得することexcも望ましいです (上記の節を含むなど)。

4

3 に答える 3

57
  • except Exception:except BaseException::

    Exceptionとのキャッチの違いは、SystemExit のような例外階層BaseExceptionによると、KeyboardInterrupt と GeneratorExit はから直接継承されるため、使用時にキャッチされないことです。except ExceptionBaseException

  • except:except BaseException::

    この2つの違いは主にpython 2(AFAIK)にあり、発生する例外として古いスタイルのクラスを使用する場合のみです。この場合、式のないexcept節のみが例外をキャッチできます。

    class NewStyleException(Exception): pass
    
    try:
       raise NewStyleException
    except BaseException:
       print "Caught"
    
    class OldStyleException: pass
    
    try:
       raise OldStyleException
    except BaseException:
       print "BaseException caught when raising OldStyleException"
    except:
       print "Caught"
    
于 2011-08-23T13:09:27.373 に答える
28

すべての例外をキャッチし、すべてに対して同じことを行う必要がある場合は、次のことをお勧めします。

try:
   #stuff
except:
   # do some stuff

「特別な」Python 例外をマスクしたくない場合は、Exception 基本クラスを使用します。

try:
   #stuff
except Exception:
   # do some stuff

管理に関連する一部の例外については、明示的にキャッチします。

try:
   #stuff
except FirstExceptionBaseClassYouWantToCatch as exc:
   # do some stuff
except SecondExceptionBaseClassYouWantToCatch as exc:
   # do some other stuff based
except (ThirdExceptionBaseClassYouWantToCatch, FourthExceptionBaseClassYouWantToCatch) as exc:
   # do some other stuff based

python docsの例外階層は、役に立つ読み物になるはずです。

于 2011-08-23T12:28:27.867 に答える
-1

基本的な例外のマスキングを避けるために、明示的に処理したい例外ではない例外を「再発生」させる必要があります。たとえば ( 8. エラーと例外から適応):

システムをインポート

試す: # 例外をスローする可能性のあることを行う: (errno、strerror) として IOError を除く: print "I/O エラー ({0}): {1}".format(errno, strerror) ValueError を除く: print "データを整数に変換できませんでした。" を除外する: # おそらく例外をログに記録します (例: デバッグ モードで) # 例外を再発生させます: 高める

于 2011-08-23T12:48:14.993 に答える