代码之家  ›  专栏  ›  技术社区  ›  nuqqsa

禁用xdebug转储捕获的异常

  •  7
  • nuqqsa  · 技术社区  · 14 年前

    默认情况下,xdebug将转储任何异常,无论它是否被捕获:

    try {
        throw new Exception();
    }
    catch (Exception $e) {
    }
    echo 'life goes on';
    

    启用xdebug和默认设置后,这段代码将实际输出如下内容(格式良好):

    ( ! ) Exception: in /test.php on line 3 Call Stack
    #   Time    Memory  Function    Location 1  0.0003  52596   {main}( )   ../test.php:0
    life goes on
    

    是否有可能禁用此行为,并让它只转储未捕获的异常?

    事先谢谢。

    更新 :我将得出这样一个结论:这是一个bug,因为xdebug.show_exception_trace在默认情况下是禁用的,但它的行为却不符合预期(在Ubuntu 9.10上使用xdebug v2.0.5和php 5.2.10)。

    2 回复  |  直到 10 年前
        1
  •  9
  •   Artefacto    14 年前

    改变 xdebug.show_exception_trace 选项(注意,默认情况下不启用)。

    xdebug.show_exception_跟踪

    类型:整数,默认值:0

    当此设置设置为1时,xdebug将在每次引发异常时显示堆栈跟踪-即使实际捕获了此异常。

        2
  •  1
  •   Koen.    10 年前

    如果代码有名称空间,则catch块应引用 \Exception —— 用反斜杠 --如果没有反斜杠,那么PHP将查找 Exception 在当前命名空间中。这通常会失败,未捕获的异常会传递到xdebug。

    以下代码将异常传递给xdebug:

    namespace foo;
    
    try {
        new \PDO(0);
    } catch (Exception $e) {
        echo "Caught!";
    }
    // Fatal error: Uncaught exception...
    

    在异常将查找(和查找)之前添加反斜杠 例外 在全局命名空间中:

    namespace foo;
    
    try {
        new \PDO(0);
    } catch (\Exception $e) {
        echo "Caught!";
    }
    // Exception caught correctly
    

    手动抛出异常可能会令人困惑(这就是我上面使用PDO的原因)。如果我们试图从当前名称空间抛出异常,PHP会告诉我们异常不存在:

    namespace foo;
    
    try {
        throw new Exception();
    } catch (Exception $e) {
        echo "Caught!";
    }
    // Fatal error: Class 'foo\Exception' not found
    

    在catch块中不使用全局引用而引发全局异常的失败方式不同:

    namespace foo;
    
    try {
        throw new \Exception();  // global Exception
    } catch (Exception $e) {
        echo "Caught!";
    }
    // Fatal error: Uncaught exception 'Exception' in...
    

    考虑到所有这些,最好总是在catch的前面加前缀 例外 用反斜杠。

    namespace foo;
    
    try {
        throw new \Exception();
    } catch (\Exception $e) {
        echo "Caught!";
    }
    // Exception caught correctly