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