• PHP错误: Exception thrown without a stack frame in Unknown on line 0[转载]


    来自:网易博客

    就目前我的了解,在两种情况下,PHP会报 Exception thrown without a stack frame in Unknown on line 0这种错误:

    1)异常捕捉用了set_exception_handler导向,Exception里面执行另一个Exception

    如下面这段代码,就会出现这种问题:

    http://de.php.net/manual/de/function.set-exception-handler.php#88082

    function error_handler($code, $message, $file, $line)
    {
        if (0 == error_reporting())
            return;
            
        throw new ErrorException($message, 0, $code, $file, $line);
    }
    function exception_handler($e)
    {
        // ... normal exception stuff goes here
        print $undefined; // This is the underlying problem
    }
    set_error_handler("error_handler");
    set_exception_handler("exception_handler");
    throw new Exception("Just invoking the exception handler");

    exception_handler函数内print $undefined;这行本身会抛出一个异常,而他又去调用set_exception_handler的exception_handler函数,死循环了。

    解决办法:不要在一个Exception里面执行另一个Exception

    上面的问题可以用try ... catch的方式,如exception_handler改成下面这样:
     

    function exception_handler($e)
    {
        try
        {
            // ... normal exception stuff goes here
            print $undefined; // This is the underlying problem
        }
        catch (Exception $e)
        {
            print get_class($e)." thrown within the exception handler. Message: ".$e->getMessage()." on line ".$e->getLine();
        }
    }

    2) 在析构函数抛出异常

    参考这个bug:http://bugs.php.net/bug.php?id=33598

    下面的代码就会报这个错误:

    class test {
        function __construct() {
            echo "Construct
    ";
        }
    
        function greet() {
            echo "Hello World
    ";
        } 
    
        function __destruct() {
            echo "Destruct
    ";
            throw new Exception( 'test' );
        }
    }
    
    $test = new test();
    $test->greet();

    目前的解决办法:

    1.不要在析构函数中抛出异常.

    2.由于析构函数是在退出时执行的,所以要手动unset这种类,并catch该异常。

    比如上面的例子,在最后加一行unset($test),这时程序就会报throw new Exception( 'test' ); 这行有错误,再catch这个异常就行了。

    上面两种情况在php 5.2.11版本上都会出现,至于原因我认为PHP可能就是这样处理的,php bug 33598 2005年就报上去了,bug Status为Closed,说明官方并不认为这是一个bug,或不当一个bug处理了。

  • 相关阅读:
    Forrester:开源APM发展势头强劲
    Forrester:开源APM发展势头强劲
    canvas 绘图api的位置问题
    canvas 绘图api的位置问题
    canvas 绘图api的位置问题
    canvas 绘图api的位置问题
    Android应用层View绘制流程与源码分析
    Android应用层View绘制流程与源码分析
    Android应用层View绘制流程与源码分析
    未来5年到底是做什么生意最好?
  • 原文地址:https://www.cnblogs.com/sumsung753/p/3873311.html
Copyright © 2020-2023  润新知