2016-07-31 14 views
4

atexit最後のエラーオブジェクトを取得し、その型をチェックするPython関数を実装する必要があります。 Pythonのエラーの種類がPHPのE_ERRORに該当する場合は、エラーの出力をファイルに保存する必要があります。PHPのerror_get_last()関数の代わりにPythonを使用していますか?

PHPコード私はそうのようなルックスを移植しています:以下のように

register_shutdown_function("fatal_handler"); 
function fatal_handler() { 
    $error = error_get_last(); 
    if ($error != null && $error['type'] === E_ERROR) 
     echo "recordFatalError: {$error['message']}\n"; 
} 

私のコードのスナップは、次のとおりです。

def fatal_handler(): 
    # How to get last error object? 

atexit.register(fatal_handler) 

誰かがどのように私に説明している場合、私は喜んでいるだろう、私は必要を得ることができますPythonでの機能

答えて

2

私はこのためにsys.last_valueを使用します。

import atexit 
import sys 

def fatal_handler(): 
    try: 
     e = sys.last_value 
    except AttributeError: # no exception prior to execution of fatal_handler 
     return 

atexit.register(fatal_handler) 

あなたは上記EAFP approachの代わりにgetattr(sys, 'last_value', None)を使用することもできます。 sys.last_valueが利用できない場合、Noneを返します。また

、あなたは通訳のシャットダウンが例外によって引き起こされている場合のみ実行したいだけで一つの関数がある場合、あなたはsys.excepthookを使用することができますが:例外が発生し、キャッチされないされている場合

import sys 

def fatal_handler(type, value, traceback): 
    e = value 

sys.excepthook = fatal_handler 
+0

このアプローチの問題は、 'sys.last_value'が、それは常に' atexit'機能付き真実ではない中にエラーが発生した場合にのみ参照することができるということです。また、値の型( 'sys.last_type')だけでなく、例外の型も必要です。 – ddnomad

+0

@ddnomadオブジェクトのタイプを見つけるのは簡単です。 'type'を使用します。利用可能な 'sys.last_type'もあります。 – vaultah

+0

まだ私は、これらの値が存在することを確認するために 'try/except'ブロックを避ける他の可能な方法に興味があります。 – ddnomad

1

、インタプリタがsys.excepthookを呼び出します例外についての情報デフォルトの関数は、与えられたトレースバックと例外をsys.stderrに出力します。この関数をこのデータを保存する関数に置き換えることができます。その後、あなたのatexitハンドラーにこのデータを使用することができます。

import atexit 
import sys 

class LastException: 
    value  = None 
    type  = None 
    trackback = None 

    @staticmethod 
    def excepthook(type,value,trackback): 
     LastException.type  = type 
     LastException.value  = value 
     LastException.trackback = trackback 

    @staticmethod 
    def register(): 
     sys.excepthook = LastException.excepthook 

def fatal_handler(): 
    print('{0} {1}'.format(LastException.type, LastException.value)) 

LastException.register() 
atexit.register(fatal_handler) 

raise BaseException("I am an error") 
# should print: <class 'BaseException'> I am an error 
関連する問題