Как поймать ошибку require () или include () в PHP?

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

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

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

Вы можете выполнить это, используя 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 } ?> 

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

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

Лучшим подходом было бы сначала использовать путь realpath на пути. realpath вернет false если файл не существует.

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

Вы даже можете создать свою собственную функцию require в пространстве имен вашего приложения, которое обертывает требуемую функцию 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"); 

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

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

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