2011-11-24 15 views
8

Estoy escribiendo un script en PHP5 que requiere el código de ciertos archivos. Cuando un archivo no está disponible para su inclusión, primero se lanza una advertencia y luego un error fatal. Me gustaría imprimir un mensaje de error propio, cuando no fue posible incluir el código. ¿Es posible ejecutar un último comando, si requeire no funcionó? la siguiente no funciona:¿Cómo atrapar el error de require() o include() en PHP?

require('fileERROR.php5') or die("Unable to load configuration file."); 

suprimiendo todos los mensajes de error utilizando error_reporting(0) sólo da una pantalla en blanco, no usar error_reporting da el php-errores, que no desea mostrar.

Respuesta

3

Un mejor enfoque sería utilizar primero realpath en la ruta. realpath devolverá false si el archivo no existe.

$filename = realpath(getcwd() . "/fileERROR.php5"); 
$filename && return require($filename); 
trigger_error("Could not find file {$filename}", E_USER_ERROR); 

Usted podría incluso crear su propia función requiere en su aplicación namespace que envuelve la función de requerir PHP

namespace app; 

function require_safe($filename) { 
    $path = realpath(getcwd() . $filename); 
    $path && return require($path); 
    trigger_error("Could not find file {$path}", E_USER_ERROR); 
} 

Ahora se puede usar en cualquier parte de sus archivos

namespace app; 

require_safe("fileERROR.php5"); 
+0

No tengo ni idea por qué, pero su código no funciona correctamente (produce falso positivo), cuando ejecutar en PHP CLI/consola. Es decir. Detiene la ejecución de la secuencia de comandos, afirmando que ese archivo XYZ no existe, mientras que realmente existe, comentando el código y yendo directamente a 'include()' funciona bien y el archivo se incluye sin errores. – trejder

1

Yo sugeriría echó un vistazo al máximo recent comment en la documentación para la función set_error_handler().

Se sugiere lo siguiente como un método (y con un ejemplo) de la captura de errores fatales:

<?php 
function shutdown() 
{ 
    $a=error_get_last(); 
    if($a==null) 
     echo "No errors"; 
    else 
     print_r($a); 

} 
register_shutdown_function('shutdown'); 
ini_set('max_execution_time',1); 
sleep(3); 
?> 

No he probado la sugerencia, pero esto además probablemente podrían utilizarse en otros escenarios de error fatal.

+0

Si bien esto puede funcionar, produce una buena pregunta, si esto funciona en condiciones, OP está preguntando? Creo que la mayoría de las personas que aterrizan aquí buscan una solución, donde pueden capturar 'require' en el archivo inexistente ** y continuar ** la ejecución del script. Ser capaz de morir con elegancia (es decir, mostrar algo, quiero pero terminar con la finalización del script aun así, y eso es lo que su código parece estar haciendo) no parece encajar en muchos escenarios. Supongo que el script puede mostrar lo que quiera si va a morir.Quiero evitar la muerte/terminación en un archivo no existente alimentado a 'require'. – trejder

0

Debe usar include(). Require(), cuando se utiliza en un archivo inexistente, produce un error fatal y sale del script, por lo que su dado() no ocurrirá. Include() solo arroja una advertencia y luego la secuencia de comandos continúa.

+0

Su respuesta es específica de una determinada versión de PHP o específica de cierta configuración de 'php.ini'. Por mi parte (PHP 5.5.4) con mi configuración, cambiar 'require' por' include' no trae ninguna diferencia. Ambos lanzan feos errores fatales, que no puedo entender. – trejder

11

Puede lograrlo utilizando set_error_handler junto con ErrorException.

El ejemplo de la página ErrorException es:

<?php 
function exception_error_handler($errno, $errstr, $errfile, $errline) { 
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline); 
} 
set_error_handler("exception_error_handler"); 

/* Trigger exception */ 
strpos(); 
?> 

Una vez que haya errores que se manejan como excepciones que puede hacer algo como:

<?php 
try { 
    include 'fileERROR.php5'; 
} catch (ErrorException $ex) { 
    echo "Unable to load configuration file."; 
    // you can exit or die here if you prefer - also you can log your error, 
    // or any other steps you wish to take 
} 
?> 
+0

@SajnEvardsson php manual tiene el tercer parámetro ErrorException como $ errno, no el segundo. – Basit

+2

El ejemplo anterior se copia directamente de los documentos ErrorException (enlace arriba) - en el ejemplo "oficial" usan $ errno como $ code, mientras que otros (incluso en los comentarios de esa página) han sugerido usarlo como $ severity - note que si te gusta puedes usarlo para ambos, o ninguno. –

6

sólo tiene que utilizar 'file_exists()':

if (file_exists("must_have.php")) { 
    require "must_have.php"; 
} 
else { 
    echo "Please try back in five minutes...\n"; 
} 
Cuestiones relacionadas