2010-05-25 4 views
7

Por defecto Xdebug volcará ninguna excepción, con independencia de si se detecta o no:Desactivación Xdebug de vertido de excepciones atrapados

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

Con XDebug activado y la configuración predeterminada de esta pieza de código algo realmente salida como la siguiente (formato agradable):

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

¿es posible desactivar este comportamiento y lo han dumping sólo las excepciones no capturadas?

Gracias de antemano.

ACTUALIZACIÓN: Estoy a punto de concluir que esto es un error, ya que xdebug.show_exception_trace está desactivado por defecto, sin embargo, no se comporta como se esperaba (usando Xdebug v2.0.5 con PHP 5.2.10 en Ubuntu 9.10)

Respuesta

9

Cambie la opción xdebug.show_exception_trace (tenga en cuenta que no está habilitada de manera predeterminada).

xdebug.show_exception_trace

Tipo: entero, el valor por defecto: 0

Cuando este valor se establece en 1, Xdebug mostrará un seguimiento de la pila cada vez que se produce una excepción - incluso si esta excepción es en realidad atrapado.

+0

Acepto que esto tiene algo que ver con xdebug.show_exception_trace. Creo que cuando se establece en 0, debe ignorar las excepciones detectadas, pero de alguna manera esto no funciona incluso cuando se deshabilita explícitamente. – nuqqsa

+0

Hable con Derick en # php.pecl @ EFNet o use el rastreador de errores en http://bugs.xdebug.org/ – Artefacto

+0

Este último comentario hace que su respuesta sea completa :) Definitivamente voy a reportar este error en caso de que pueda todavía lo reproduce en 2.1.0RCx. Gracias. – nuqqsa

1

Si se namespaced su código, el bloque catch debe hacer referencia a \Exception - con la barra invertida - si no hay barra invertida entonces PHP buscará Exception en el espacio de nombres actual. Esto generalmente falla y la excepción no detectada se pasa a Xdebug.

El código siguiente pasa la excepción a Xdebug:

namespace foo; 

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

Adición de una barra invertida antes de Excepción buscará (y encontrar) Exception en el espacio de nombres global:

namespace foo; 

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

excepciones tirando manualmente pueden ser confuso (por eso usé PDO arriba). Si tratamos de arrojar una excepción desde el espacio de nombres actual, PHP nos dice excepción no existen allí:

namespace foo; 

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

Lanzar una excepción global sin una referencia mundial en el bloque catch falla diferente:

namespace foo; 

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

A la luz de todo esto, es probable que sea una buena idea siempre marcar el Exception con una barra diagonal inversa.

namespace foo; 

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