как отловить ошибку на функцию "включить" PHP? - PullRequest
4 голосов
/ 22 декабря 2011

мне нужно захватить последнюю ошибку в функции "include" PHP.

Я тестирую с функциями "Exceptions", но, к сожалению, я написал выше функцию "include".

ЕслиЯ пишу после того, как функция «включить» не показывает исключение.

Пример 1:

try{
        throw new exception();
        require_once( $this->controller['path'] );
    }
    catch( exception $e )
    {
        print_r( error_get_last() );
    }

Этот возврат: ...(Void) ...

Пример 2:

try{

        require_once( $this->controller['path'] ) OR throw new exception();;
    }
    catch( exception $e )
    {
        print_r( error_get_last() );
    }

Это возвращение: Ошибка разбора: синтаксическая ошибка, неожиданный T_THROW в ...

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

У кого-нибудь есть идеи, как это получить?

Ребята!Мне нужно отлавливать синтаксические ошибки.Привет!

Ответы [ 4 ]

7 голосов
/ 22 декабря 2011

Во-первых, если вы используете require, оно всегда убьет ваше приложение, если файл не может быть включен. Там нет контроля над результатом, вы не можете ничего сделать потом. Если вы хотите контролировать успешность включений файлов, используйте include и проверьте его возвращаемое значение.

$success = include "foo.php";
if (!$success) {
    // the file could not be included, oh noes!
}

Вы можете иметь синтаксические различия по этому поводу:

if (!(include "foo.php")) ...

будет вызывать E_NOTICE, если файл не может быть включен, который вы не можете перехватить. Но это нормально, так как это поможет вам отладить проблему, и отображение ошибок в любом случае будет отключено в рабочей среде (справа, вправо ?).

or throw new Exception не работает, потому что throw является оператором и не может использоваться там, где ожидается выражение.


Если вы хотите перехватить синтаксические ошибки в файле , включенном в , используйте php_check_syntax / его преемник php -l <file>.

5 голосов
/ 22 декабря 2011

require_once является языковой конструкцией, а не функцией, и вы не можете использовать ее для короткого замыкания.

Чтобы проверить, существует ли файл перед его включением, вы можете использовать is_file(). Если вы хотите проверить, доступен ли файл для чтения, вы можете использовать is_readable().

Вы также можете использовать include, который выдает E_WARNING, если файл не может быть найден, а не E_COMPILE_ERROR.

1 голос
/ 22 декабря 2011

Большинство нативных функций PHP вызывают ошибки, а не генерируют исключения. Чтобы преобразовать ошибки PHP в исключения, вы можете настроить собственный обработчик ошибок:

function exceptions_error_handler($severity, $message, $filename, $lineno) { 
    throw new ErrorException($message, 0, $severity, $filename, $lineno); 
}
set_error_handler('exceptions_error_handler');

С помощью этого кода вы сможете перехватывать все нефатальные ошибки как исключения. Обратите внимание, что require_* функции генерируют фатальную ошибку, поэтому вам придется использовать include вместо этого.

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

1 голос
/ 22 декабря 2011

Я согласен с Алексом, попробуйте исправить ошибку, отметив file_exists(), затем используйте исключение

if(file_exists($this->controller['path'])){
    try{
       require_once( $this->controller['path'] );
    }catch(Exception $e){
          // throw error
    }
}

или используйте is_readable ()

if(is_readable($this->controller['path'])){
    try{
       require_once( $this->controller['path'] );
    }catch(Exception $e){
          // throw error
    }
} 
...