R_Usuario
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ó? lo siguiente no funcionó:
require('fileERROR.php5') or die("Unable to load configuration file.");
Supresión de todos los mensajes de error usando error_reporting(0)
solo da una pantalla en blanco, no usar error_reporting da PHP-Errors, que no quiero mostrar.
Sjan Evardsson
Puedes lograr esto usando set_error_handler
junto con ErrorException
.
El ejemplo de la ErrorException
la pagina 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 manejado los errores como excepciones, 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
}
?>
-
@SajnEvardsson php manual tiene el tercer parámetro ErrorException como $errno, no el segundo.
– base
23 de enero de 2013 a las 21:52
-
El ejemplo anterior se copia directamente de los documentos de ErrorException (enlace anterior): en el ejemplo “oficial” usan $errno como $código, mientras que otros (incluidos los comentarios en esa página) han sugerido usarlo como $severidad: tenga en cuenta que si lo desea, puede usarlo para ambos, o ninguno.
– Sjan Evardsson
29 de enero de 2013 a las 17:35
-
Parece una forma demasiado diseñada de hacer algo muy simple.
– Jacek Dziurdzikowski
04/06/2020 a las 21:45
-
Esta es realmente una solución útil en mi situación. Tengo un código heredado (¡pre-framework!) que tiene sufijos en los nombres de archivo…
ClassA.class.php
oInterfaceA.interface.php
. Objetivo a largo plazo: arreglar todo eso. A corto plazo: reduzca las comprobaciones redundantes de existencia de archivos intentando ambas cosas de forma segura.– error de precaución
23 de mayo a las 15:31
Solo uso ‘file_exists ()’:
if (file_exists("must_have.php")) {
require "must_have.php";
}
else {
echo "Please try back in five minutes...\n";
}
-
mejor usar es_legible(); verifica la existencia del archivo, además de la legibilidad del archivo (simplemente, un archivo debe existir para ser legible). Además, para evitar incluir directorios, debe usar es_dir() (es decir, !is_dir($nombre de archivo)).
– MAChitgarha
2 de julio de 2018 a las 18:21
-
file_exists
no verifica la ruta de inclusión, por lo que es posible que no funcione– Dan Stevens
10 dic 2019 a las 18:00
-
incluir
die()
al final de tu eco.require
detendrá la ejecución del script y, si el archivo no existe, se mostrará el eco y se cargará el resto de la página. Pero en lugar de agregardie()
at the no mostrará nada en la página que no sea el mensaje.– Dexter
30 de enero de 2020 a las 13:47
-
También funciona con DIRECTORIOS, no solo archivos, lo que es aún mejor
– Mbotet
17 de marzo de 2021 a las 8:56
macek
Un mejor enfoque sería utilizar camino real en el camino primero. realpath
regresará 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);
Incluso podría crear su propia función de solicitud en la aplicación espacio de nombres que envuelve la función require de 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 puedes usarlo en cualquier parte de tus archivos.
namespace app;
require_safe("fileERROR.php5");
-
No tengo ni idea de por qué, pero su código no funciona correctamente (produce un falso positivo), cuando se ejecuta en PHP CLI/consola. Es decir, detiene la ejecución del script, alegando que el archivo XYZ no existe, mientras que en realidad sí existe, comentando su código y yendo directamente a
include()
funciona bien y el archivo se incluye sin errores.– Trejder
8 de mayo de 2015 a las 6:56
Necesitas usar include(). Require(), cuando se usa en un archivo inexistente, produce un error fatal y sale del script, por lo que su die() no sucederá. Incluir () solo arroja una advertencia y luego el script continúa.
Le sugiero que eche un vistazo a la mayoría comentario reciente en la documentación de la set_error_handler() función.
Sugiere lo siguiente como método (y con un ejemplo) para detectar 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 probé la sugerencia, pero esto probablemente podría usarse en otros escenarios de error fatal.
-
Si bien esto puede funcionar, produce una buena pregunta, ¿si funcionará en las condiciones que OP pregunta? Creo que la mayoría de las personas que aterrizan aquí están buscando una solución, donde puedan atrapar
require
en archivo inexistente y continuar ejecución de guiones. Ser capaz de morir con gracia (es decir, mostrar algo, quiero pero termino con la terminación del script aun así, y eso es lo que parece estar haciendo su código) 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 arequire
.– Trejder
8 de mayo de 2015 a las 6:59
Prashant
Una forma simple que estoy usando es que
<?php
...
if(!include 'config.php'){
die("File not found handler. >_<");
}
...
?>
-
Si bien esto puede funcionar, produce una buena pregunta, ¿si funcionará en las condiciones que OP pregunta? Creo que la mayoría de las personas que aterrizan aquí están buscando una solución, donde puedan atrapar
require
en archivo inexistente y continuar ejecución de guiones. Ser capaz de morir con gracia (es decir, mostrar algo, quiero pero termino con la terminación del script aun así, y eso es lo que parece estar haciendo su código) 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 arequire
.– Trejder
8 de mayo de 2015 a las 6:59