Как поймать ошибку E_NOTICE “неопределенный индекс” в SimpleTest?
-
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)