【问题标题】:What is Python replacement for PHP's error_get_last() function?什么是 PHP 的 error_get_last() 函数的 Python 替代品?
【发布时间】:2016-12-05 17:05:05
【问题描述】:

我需要实现一个atexit Python 函数来获取最后一个错误对象并检查它的类型。如果 python 错误的类型对应于 PHP 的 E_ERROR 我应该将错误的输出保存到文件中。

我正在移植的 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 获得必要的功能,我会很高兴。

【问题讨论】:

    标签: python php exception porting


    【解决方案1】:

    我会为此使用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)
    

    您可以选择使用getattr(sys, 'last_value', None) 代替上面的EAFP approach。如果sys.last_value 不可用,则返回None

    或者,如果您只想在解释器因异常而关闭时运行一个函数,您可以使用sys.excepthook

    import sys
    
    def fatal_handler(type, value, traceback):
       e = value
    
    sys.excepthook = fatal_handler
    

    【讨论】:

    • 这种方法的问题是 sys.last_value 只有在发生错误时才能被引用,而 atexit 函数并不总是如此。此外,我还需要一种异常类型,而不仅仅是值 (sys.last_type)。
    • @ddnomad 很容易找到任何对象的类型,例如使用type。还有sys.last_type 可用。
    • 但我对避免try/except 块检查这些值是否存在的其他可能方法感兴趣。
    【解决方案2】:

    当引发异常但未被捕获时,解释器会调用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-08
      • 2011-02-03
      • 2019-02-22
      • 2011-05-07
      • 2012-04-24
      • 2019-12-03
      • 2010-09-17
      • 2012-03-27
      相关资源
      最近更新 更多