什么是PHP的error_get_last()函数的Python替代品?
问题描述:
我需要实现一个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的功能。
答
我会用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
答
当异常上升,未捕获,解释称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
的问题,这种做法是'sys.last_value'只有当错误已经发生了被引用,而这并不总是正确使用'atexit'功能。另外我还需要一个类型的异常,不仅是值('sys.last_type')。 – ddnomad
@ddnomad找到任何对象的类型是很简单的,例如使用'type'。还有'sys.last_type'可用。 – vaultah
但我对避免尝试/除外'块检查这些值是否存在的其他可能方式感兴趣。 – ddnomad