Я написал тест PHPUnit, который проверяет, выбрано ли исключение из закрытия при вызове метода. Функция закрытия передается в качестве аргумента методу с исключением из него.Почему мое исключение выбрасывается из замыкания, которое не было поймано?
public function testExceptionThrownFromClosure()
{
try {
$this->_externalResourceTemplate->get(
$this->_expectedUrl,
$this->_paramsOne,
function ($anything) {
throw new Some_Exception('message');
}
);
$this->fail("Expected exception has not been found");
} catch (Some_Exception $e) {
var_dump($e->getMessage()); die;
}
}
Код функции задавалась на ExternalResourceTemplate является
public function get($url, $params, $closure)
{
try {
$this->_getHttpClient()->setUri($url);
foreach ($params as $key => $value) {
$this->_getHttpClient()->setParameterGet($key, $value);
}
$response = $this->_getHttpClient()->request();
return $closure($response->getBody());
} catch (Exception $e) {
//Log
//Monitor
}
}
Любые идеи, почему называется провал заявление утверждают? Можете ли вы не поймать исключения, выброшенные из замыканий на PHP, или есть конкретный способ борьбы с ними, о котором я не знаю.
Для меня исключение должно просто распространять исходный стек, но он не отображается. Это ошибка? FYI Я бегу PHP 5.3.3
Вы можете попасть только в том же объеме, что и бросок. Внутренний охват в этом отношении оторван от внешнего. Я не знаю языка, в котором поведение в противном случае. –
Спасибо Beetroot-Beetroot, что было на самом деле проблемой. Блок catch никогда не вызывается в тесте, потому что исключение было проглочено в классе ExternalResourceTemplate –
. Я не совсем уверен, что вы оба имеете в виду то же самое. Нераспространение исключения отличается от отсутствия исключения в другом стеке вызова/разматывания. Во всяком случае, как правило, наличие блока catch исключительно для ведения журнала: do not ;-) – VolkerK