Как поймать ошибку require() или include() в PHP?
Я пишу script в PHP5, для которого требуется код определенных файлов. Когда файл недоступен для включения, сначала выдается предупреждение, а затем фатальная ошибка. Я хотел бы напечатать собственное сообщение об ошибке, когда было невозможно включить код. Можно ли выполнить одну последнюю команду, если запрос не работает? следующее не получилось:
require('fileERROR.php5') or die("Unable to load configuration file.");
Подавление всех сообщений об ошибках с помощью error_reporting(0)
дает только белый экран, не используя error_reporting, дает PHP-ошибки, которые я не хочу показывать.
Ответы
Ответ 1
Вы можете выполнить это, используя set_error_handler
в сочетании с ErrorException
.
Пример страницы ErrorException
:
<?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();
?>
Как только вы обрабатываете ошибки как исключения, вы можете сделать что-то вроде:
<?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
}
?>
Ответ 2
Я просто использую 'file_exists()':
if (file_exists("must_have.php")) {
require "must_have.php";
}
else {
echo "Please try back in five minutes...\n";
}
Ответ 3
Лучшим подходом было бы использовать realpath на пути в первую очередь. realpath
вернет false
, если файл не существует.
$filename = realpath(getcwd() . "/fileERROR.php5");
$filename && return require($filename);
trigger_error("Could not find file {$filename}", E_USER_ERROR);
Вы даже можете создать свою собственную функцию require в своем приложении namespace, для которой требуется функция 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);
}
Теперь вы можете использовать его в любом месте в своих файлах
namespace app;
require_safe("fileERROR.php5");
Ответ 4
Я бы посоветовал вам взглянуть на недавний комментарий в документации для set_error_handler().
Он предлагает следующее как метод (и пример) улавливания фатальных ошибок:
<?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);
?>
Я не пробовал это предложение, но это можно было бы использовать в других фатальных сценариях ошибок.
Ответ 5
Вам нужно использовать include(). Require() при использовании в несуществующем файле производит фатальную ошибку и выходит из script, поэтому ваш die() не будет выполняться. Include() только предупреждает, а затем продолжает script.
Ответ 6
Простой способ, которым я пользуюсь, заключается в том, что
<?php
...
if(!include 'config.php'){
die("File not found handler. >_<");
}
...
?>