Я пишу скрипт в 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 () только предупреждает, а затем продолжает скрипт.