如何捕获require_once/include_once异常?

Gar*_*Dan 4 php exception try-catch require include

我正在尝试编写类似的代码:

<?php
$includes = array(
    'non_existing_file.php', //This file doesn't exist.
);

foreach ($includes as $include) {
    try {
        require_once "$include";
    } catch (Exception $e) {
        $message = $e->getMessage();
        echo "
            <strong>
              <font color=\"red\">
                A error ocurred when trying to include '$include'.
                Error message: $message
              </font>
            </strong>
        ";
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经试过require_onceinclude_once,但try catch没有捕获异常.

我怎么能抓住这个致命的错误/警告异常?

pas*_*der 15

由于include/require不会抛出异常,因此请检查您要包含的文件是否存在且可读.例如:

$inc = 'path/to/my/include/file.php';

if (file_exists($inc) && is_readable($inc)) {

    include $inc;

} else {

    throw new Exception('Include file does not exists or is not readable.');
}
Run Code Online (Sandbox Code Playgroud)


soy*_*uka 6

这些函数抛出E_COMPILE_ERROR,并且不能像这样捕获.

要处理这些错误,请参阅set_error_handler.


Gar*_*Dan 3

这个解决方案(改编自这里)对我来说效果很好:

register_shutdown_function('errorHandler');

function errorHandler() { 
    $error = error_get_last();
    $type = $error['type'];
    $message = $error['message'];
    if ($type == 64 && !empty($message)) {
        echo "
            <strong>
              <font color=\"red\">
              Fatal error captured:
              </font>
            </strong>
        ";
        echo "<pre>";
        print_r($error);
        echo "</pre>";
    }
}
Run Code Online (Sandbox Code Playgroud)