2011-09-24 15 views
5

Estoy haciendo un pequeño navegador de archivos para la tarea, y lo tengo funcionando tan bien como necesito, pero estoy un poco confundido al manejar escenarios de error en PHP ahora que estoy tratando de refactorizar mi codificación.¿Debo intentar/atrapar opendir en PHP debido a E_WARNING?

Estoy acostumbrado a la manipulación de errores C++/C# try/catch, que PHP parece tener alguna variante de. Lo que me está confundiendo es la siguiente:

opendir de recursos (string $ ruta [, resource $ contexto])

devuelve un recurso gestor de directorio en caso de éxito, en caso de fallo.

Si la ruta no es un directorio válido o el directorio no se puede abrir debido a restricciones de permisos o errores del sistema de archivos, opendir() devuelve FALSO y genera un error de PHP de nivel E_WARNING. Puede suprimir la salida de error de opendir() anteponiendo '@' al frente del nombre de la función .

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

¿Necesito detectar el error PHP generado del nivel E_WARNING mencionado allí, o es tonto? No entiendo por qué volvería falso y arrojaría un error. ¿No debería el error arrojarlo para que no regrese normalmente?

+3

Este es un ejemplo de la incoherencia intrínseca de PHP, que definitivamente es un lenguaje * scripting *. No tomarás advertencias con try ... catch. Las excepciones y los errores/advertencias son parte de dos mecanismos diferentes, y las excepciones se agregaron más adelante. Es un desastre. Sea ** muy ** cuidadoso escribiendo cosas en PHP: los idiomas en los que es experto (C++/C#) son consistentes, PHP no lo es. Cuidadoso. – gd1

+0

Tenga cuidado con '@' para manejar "errores". Esto suprimirá todos los errores, no solo las advertencias. Vea la alerta en el Manual de PHP: http://www.php.net/manual/en/language.operators.errorcontrol.php –

+1

. Sabía que algo gracioso estaba sucediendo allí. El primer sitio que leí al respecto llamó a E_WARNING una excepción que me confunde. Gracias por el cara a cara chicos. –

Respuesta

7

Utilizaría catch para tratar con un Exception elevado. Un error de PHP es algo diferente. Los errores de PHP tienen diferentes niveles o severidad. Puede modificar cuál de estos errores se genera usando error_reporting(). Para suprimir un error de PHP individual en un comunicado, utilice @, como: @opendir(..)

1

Las advertencias solo deben arrojarse en entornos de prueba/aceptación. Se puede comprobar con seguridad si existe el directorio fuerte en comparación con falsa

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

El Waring puede ser capturado con un manipulador personalizado que puede escribirla en un archivo de registro en lugar de mostrarlo en la pantalla.

1

Puede suprimir la advertencia con el @ simbol como @opendir(). Esto es común para suprimir las advertencias del manejador de recursos, ya que hay casos en que el recurso no está disponible, pero estos deben manejarse con cuidado.

En el entorno en vivo, debe mostrarse el error desactivado, por lo que solo es útil en el desarrollo, pero puede romper la página generada, por lo que puede ser útil suprimirlo.

2

errores/advertencias producidas de esta manera no pueden por lo tanto ser manejados usando try/catch debido a que la infraestructura de lenguaje que se ocupa de ellos se remonta a antes de PHP apoyado excepciones o try/catch.

Solo podrá utilizar realmente try/catch cuando esté utilizando los módulos PHP más modernos, que usan clases y generan excepciones en lugar de errores y advertencias.

La mayor parte de la funcionalidad principal de PHP aún se basa en el antiguo mecanismo de manejo de errores.

Lo primero que debe hacer con opendir() es verificar que el directorio exista y pueda abrirse antes de intentar abrirlo; esto evitará que necesites manejar las condiciones de error con opendir().

Si todavía tiene cuidado con las advertencias lanzadas, puede suprimir las advertencias con el símbolo @. Tenga en cuenta que esto también suprimirá los errores genuinos.

Alternativamente, si está realmente aburrido, podría crear un contenedor para todo, lo que cambia el nivel de error_reporting() antes de realizar la llamada y luego volver a establecerla. Incluso podría hacer que arroje una excepción para usted si es necesario.

Así que estas cosas se pueden hacer, pero es poco probable que valga la pena; también puede vivir con el hecho de que el manejo de errores de PHP no es excelente, y ha evolucionado con el tiempo en lugar de ser cuidadosamente pensado en primer lugar como lo fue C++/C#.

+0

Ninguna de estas soluciones sigue las pautas de Code Climate –

Cuestiones relacionadas