Как поймать ошибку E_NOTICE “неопределенный индекс” в SimpleTest?

StackOverflow https://stackoverflow.com/questions/3261051

  •  16-09-2020
  •  | 
  •  

Вопрос

Я хотел бы написать тест с использованием SimpleTest, который завершится неудачей, если метод, который я тестирую, приведет к PHP E_NOTICE "неопределенный индекс :фу".

Я пытался expectError() и expectException() безуспешно.Веб-страница SimpleTest указывает, что SimpleTest не способен перехватывать ошибки PHP во время компиляции, но E_NOTICE похоже, это ошибка во время выполнения.

Есть ли способ перехватить такую ошибку и заставить мой тест завершиться неудачей, если это так?

Это было полезно?

Решение

Это было не очень легко, но в конце концов мне удалось уловить E_NOTICE ошибка, которую я хотел.Мне нужно было переопределить текущий error_handler чтобы создать исключение, которое я перехвачу в try{} заявление.

function testGotUndefinedIndex() {
    // Overriding the error handler
    function errorHandlerCatchUndefinedIndex($errno, $errstr, $errfile, $errline ) {
        // We are only interested in one kind of error
        if ($errstr=='Undefined index: bar') {
            //We throw an exception that will be catched in the test
            throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
        }
        return false;
    }
    set_error_handler("errorHandlerCatchUndefinedIndex");

    try {
        // triggering the error
        $foo = array();
        echo $foo['bar'];
    } catch (ErrorException $e) {
        // Very important : restoring the previous error handler
        restore_error_handler();
        // Manually asserting that the test fails
        $this->fail();
        return;
    }

    // Very important : restoring the previous error handler
    restore_error_handler();
    // Manually asserting that the test succeed
    $this->pass();
}

Это кажется немного чрезмерно сложным, поскольку приходится повторно объявлять обработчик ошибок, чтобы генерировать исключение только для его перехвата.Другой сложной частью было корректное восстановление error_handler как при перехвате исключения, так и при отсутствии ошибки, в противном случае это просто затрудняет простейшую обработку ошибок.

Другие советы

На самом деле нет необходимости перехватывать сообщение об ошибке.Можно также проверить результат 'array_key_exists', а затем продолжить оттуда.

http://www.php.net/manual/en/function .array-key-exists.php

Проверьте на false и пусть это не сработает.

Вы никогда не поймаете это в блоке try-catch, к счастью, у нас есть set_error_handler():

<?php
function my_handle(){}
set_error_handler("my_handle");
echo $foo["bar"];
?>

Вы можете делать все, что захотите, внутри функции my_handle() или просто оставить ее пустой, чтобы отключить уведомление, хотя это и не рекомендуется.Обычный обработчик должен быть таким:

function myErrorHandler($errno, $errstr, $errfile, $errline)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top