2010-05-25 11 views
7

Per impostazione predefinita Xdebug sarà il dump alcuna eccezione, indipendentemente dal fatto che sia catturato o no:Disattivazione Xdebug di scarico di eccezioni catturate

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

Con XDebug abilitato e le impostazioni di default questo pezzo di codice qualcosa sarà effettivamente output come il seguente (ben formattato):

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

È possibile disabilitare questo comportamento e fare in modo che vengano eseguite solo le eccezioni non rilevate?

Grazie in anticipo.

UPDATE: Sto per concludere che si tratta di un bug, in quanto xdebug.show_exception_trace è disabilitato per default ma non si comporta come previsto (utilizzando Xdebug v2.0.5 con PHP 5.2.10 su Ubuntu 9.10).

risposta

9

Modificare l'opzione xdebug.show_exception_trace (notare che non è abilitato per impostazione predefinita).

xdebug.show_exception_trace

Tipo: intero, Valore predefinito: 0

Quando questa impostazione è impostata a 1, Xdebug mostrerà una traccia dello stack quando viene sollevata un'eccezione - anche se tale eccezione è effettivamente catturato.

+0

Sono d'accordo che questo ha qualcosa a che fare con xdebug.show_exception_trace. Penso che quando impostato a 0 dovrebbe ignorare le eccezioni rilevate, ma in qualche modo questo non funziona anche disabilitandolo esplicitamente. – nuqqsa

+0

Parla con Derick su # php.pecl @ EFNet o usa il bug tracker su http://bugs.xdebug.org/ – Artefacto

+0

Questo ultimo commento completa la tua risposta :) Segnalerò sicuramente questo errore nel caso io possa riproducilo ancora in 2.1.0RCx. Grazie. – nuqqsa

1

Se il codice viene namespace, il blocco catch dovrebbe fare riferimento \Exception-con il backslash - se non c'è backslash allora PHP cercherà Exception nello spazio dei nomi corrente. Questo di solito fallisce e l'eccezione non rilevata viene passata a Xdebug.

Il codice seguente passa l'eccezione alla Xdebug:

namespace foo; 

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

Aggiunta di una barra rovesciata prima eccezione sarà cercare (e trovare) Exception nel namespace globale:

namespace foo; 

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

lancio manualmente eccezioni possono essere confusione (che è il motivo per cui ho usato PDO sopra). Se cerchiamo di gettare un'eccezione dallo spazio dei nomi corrente, PHP ci dice eccezione non esiste là:

namespace foo; 

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

Lanciare un'eccezione globale senza un punto di riferimento a livello mondiale nel blocco catch fallisce in modo diverso:

namespace foo; 

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

Alla luce di tutto questo, è probabilmente una buona idea anteporre sempre il valore Exception del catch con una barra rovesciata.

namespace foo; 

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