2011-09-11 21 views
13

Sto seguendo le buone pratiche di programmazione e sto registrando gli errori PHP in file invece di visualizzarli all'utente. Io uso set_error_handler() per quello.@ gestore soppressione degli errori e set_error_handler

Ora il problema. Ad esempio, ho da qualche parte:

@file_exists('/some/file/that/is/outside/openbasedir.txt'); 

Ma nonostante l'operatore di soppressione degli errori, il messaggio di errore registra. Non lo voglio Voglio che gli errori soppressi non vengano trasmessi al mio gestore degli errori.

+2

Evitare l'uso di '@'. È un buon segno, che hai fatto qualcosa di sbagliato e non vuoi ripararlo. Tuttavia, viene richiamato il callback errorhandler, anche se l'istruzione stessa è "silenziata" tramite '@'. – KingCrunch

+0

Penso che l'uso di '@ $ a' sia accettabile invece di' isset ($ a)? $ A: '' '. La leggibilità del codice sovrappone gli "svantaggi". –

+0

@Rok: noterete che ha anche alcune implicazioni sulle prestazioni; '@' nasconde gli errori, ma sono ancora generati, formattati, i gestori degli errori sono chiamati, ecc. Basta strutturare il codice in modo da non dover usare molto isset(). – arnaud576875

risposta

23

L'operatore @ temporaneamente imposta error_reporting a 0, in modo da poter testare il valore di error_reporting nel vostro gestore di errore:

if (ini_get('error_reporting') == 0) { 
    return; 
} 

O, meglio ancora, accedere solo i tipi di errore che sono in error_reporting:

$error_reporting = ini_get('error_reporting'); 

if (!($error_reporting & $errno)) { 
    return; 
} 

anche dare un'occhiata alle opzioni log_errors e error_log, per la registrazione automatica degli errori in un file o di syslog.

+0

Quindi, in pratica stai dicendo che @ ** temporaneamente ** imposta error_reporting su zero? –

+0

Sì, questo è ciò che fa – arnaud576875

+1

Grazie, questo è esattamente quello che ho chiesto **. Questo lo fa perfettamente. –

2

In realtà si dovrebbe evitare l'utilizzo dell'operatore @. Prima di tutto, è lento, e lo chiamerei dannoso.

Che cosa si dovrebbe avere invece è in php.ini di file sono due linee:

error_repoting = E_ALL | E_STRICT 
display_errors = Off 

... o, se non si ha accesso al file php.ini, poi in cima alla index.php (o qualsiasi altro file di bootstrap) dovresti aggiungere:

error_reporting(E_ALL | E_STRICT); 
ini_set('display_errors', 0); 
+1

mi ferito .. perché ho avuto un downvote qui .. era l'ortografia? –

+1

Non ho fatto downvote ma semplicemente dicendo di evitare @ usage non risponde alla domanda. PHP a volte getta delle eccezioni, che possono essere scoperte, a volte visualizza avvisi stupidi, che non possono essere scoperti. In tal caso, disattivare gli errori per l'intera applicazione non è una soluzione ragionevole. Silenziarli sul posto non è l'ideale, ma leggermente meglio (specialmente per casi come file_exists o file_get_contents che già restituiscono false in caso di errore, quindi non è necessario l'avviso). Idealmente, PHP non sarebbe rotto nel modo in cui riporta errori, ma dal momento che è necessario lavorare con quello. –

Problemi correlati