2016-07-31 68 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

但我對避免嘗試/除外'塊檢查這些值是否存在的其他可能方式感興趣。 – 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