Это было не очень легко, но мне, наконец, удалось поймать ошибку 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 как при исключении, так и при ошибке, а в противном случае это просто беспорядок с обработкой ошибок SimpleTest.
Как ужасный язык! – m93a
Если вы предоставили E_NOTICE в качестве второго параметра set_error_handler, он будет обрабатывать только уведомления. «Может использоваться для маскировки запуска функции _error_handler_, как и для параметров установки параметров error_reporting ini, в которых отображаются ошибки. Без этой маски установка _error_handler_ будет вызываться для каждой ошибки независимо от установки параметра error_reporting." – nick