Как отловить ошибку require () или include () в PHP? - PullRequest
15 голосов
/ 24 ноября 2011

Я пишу скрипт на PHP5, который требует код определенных файлов. Когда файл недоступен для включения, сначала выдается предупреждение, а затем фатальная ошибка. Я хотел бы напечатать собственное сообщение об ошибке, когда было невозможно включить код. Можно ли выполнить одну последнюю команду, если запрос не сработал? следующее не сработало:

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

При подавлении всех сообщений об ошибках с помощью error_reporting(0) отображается только белый экран, без использования error_reporting - ошибки PHP, которые я не хочу показывать.

Ответы [ 6 ]

16 голосов
/ 31 декабря 2012

Это можно сделать с помощью 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
}
?>
15 голосов
/ 12 февраля 2015

Я просто использую 'file_exists ()':

if (file_exists("must_have.php")) {
    require "must_have.php";
}
else {
    echo "Please try back in five minutes...\n";
}
5 голосов
/ 24 ноября 2011

Лучше было бы сначала использовать 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-функцию require

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");
2 голосов
/ 24 ноября 2011

Я бы посоветовал вам взглянуть на самый последний комментарий в документации для функции 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);
?> 

Я не пробовал это предложение, но его можно использовать в других случаях фатальных ошибок.

1 голос
/ 25 ноября 2011

Вам нужно использовать include (). Require (), когда используется для несуществующего файла, выдает фатальную ошибку и завершает работу скрипта, поэтому ваш die () не произойдет. Include () только выдает предупреждение, а затем сценарий продолжается.

0 голосов
/ 24 июня 2019

Простой способ, которым я пользуюсь, это то, что

<?php
    ...
    if(!include 'config.php'){
        die("File not found handler. >_<");
    }
   ...
?>
...