2011-09-24 11 views
5

Sto facendo un piccolo browser di file per i compiti a casa - e lo faccio funzionare come ho bisogno, ma sono un po 'confuso nel gestire gli scenari di errore in PHP ora che sto cercando di ridefinire la mia codifica.Devo provare/prendere su opendir in PHP a causa di E_WARNING?

Sono abituato a C++/C# try/catch gestione degli errori, che PHP sembra avere qualche variante di. Ciò che mi confonde è questa:

risorsa opendir (string $ path [, resource $ contesto])

Restituisce una risorsa handle della directory in caso di successo, o FALSE in caso di fallimento.

Se percorso non è una directory valida o la directory non può essere aperto a causa di restrizioni sui permessi o errori del filesystem, opendir() restituisce FALSE e genera un errore PHP di livello E_WARNING. È possibile sopprimere l'output di errore di opendir() anteponendo '@' alla parte anteriore del nome della funzione .

da http://php.net/manual/en/function.opendir.php.

Devo rilevare l'errore PHP generato del livello E_WARNING menzionato qui o è ridicolo? Non capisco perché restituirebbe false e genererebbe un errore - l'errore non dovrebbe essere generato in modo che tu non ritorni normalmente?

+3

Questo è un esempio dell'incoerenza intrinseca di PHP, che è sicuramente un * linguaggio * di scripting *. Non catturerai avvertimenti con try ... catch. Le eccezioni e gli errori/avvertenze fanno parte di due meccanismi diversi e le eccezioni sono state aggiunte in seguito. È un bel casino. Sii ** molto ** attento a scrivere cose in PHP: le lingue di cui sei esperto (C++/C#) sono coerenti, PHP no. Attento. – gd1

+0

Stai attento a usare '@' per gestire gli errori ". Questo sopprimerà tutti gli errori, non solo gli avvertimenti. Vedere l'avviso sul manuale PHP: http://www.php.net/manual/en/language.operators.errorcontrol.php –

+1

Sapevo che stava succedendo qualcosa di divertente. Il primo sito che ho letto su questo argomento ha chiamato E_WARNING un'eccezione che mi ha confuso. Grazie per l'heads up ragazzi. –

risposta

7

Si utilizzerà catch per gestire uno Exception sollevato. Un errore PHP è qualcosa di diverso. Gli errori PHP hanno diversi livelli o gravità. È possibile modificare quale di questi errori viene emesso utilizzando error_reporting(). Al fine di eliminare un errore PHP individuale su una dichiarazione, utilizzare @, come: @opendir(..)

1

Gli avvisi devono essere emessi solo in ambienti di test/accettazione. È possibile controllare in modo sicuro se la directory esiste da una forte confrontato con falsa

if (opendir($dir) === false) 
    echo "it failed!"; 

Il Waring può essere preso con un gestore di errore personalizzato che può scrivere in un file di log che mostra invece sullo schermo.

1

È possibile sopprimere l'avviso con il simbolo @ come @opendir(). Questo è comune per sopprimere gli avvisi del gestore di risorse, poiché ci sono casi in cui la risorsa non è disponibile, ma questi devono essere gestiti con attenzione.

In ambiente live dovresti visualizzare l'errore, quindi è utile solo nello sviluppo, ma potrebbe interrompere la pagina generata, quindi potrebbe essere utile sopprimerlo.

2

Errori/avvertimenti prodotte in questo modo non possono quindi essere gestiti utilizzando try/catch perché l'infrastruttura linguaggio che li gestisce risale a prima PHP supportato eccezioni o try/catch.

È possibile utilizzare lo try/catch solo quando si utilizzano i moduli PHP più moderni, che utilizzano classi e generano eccezioni anziché errori e avvisi.

La maggior parte delle funzionalità di base di PHP è ancora basata sul vecchio meccanismo di gestione degli errori.

La prima cosa che dovresti fare con opendir() sta verificando che la directory esista e possa essere aperta prima che tu tenti di aprirla; ciò impedirà di dover gestire le condizioni di errore con lo stesso opendir().

Se si è ancora cauti in merito agli avvisi che vengono lanciati, è possibile sopprimere gli avvisi utilizzando il simbolo @. Sappi che questo sopprimerà anche gli errori veri.

In alternativa, se sei davvero annoiato, puoi creare un wrapper per l'intera operazione, che modifica il livello error_reporting() prima di effettuare la chiamata e di reimpostarla in un secondo momento. Potresti persino farti fare un'eccezione se necessario.

Quindi queste cose possono essere fatte, ma è improbabile che valga la seccatura; si può anche solo vivere con il fatto che la gestione degli errori di PHP non è grande, e si è evoluta nel tempo piuttosto che essere attentamente pensata in primo luogo come lo era C++/C#.

+0

Nessuna di queste soluzioni segue le linee guida sul codice clima –

Problemi correlati