- PVSM.RU - https://www.pvsm.ru -
Добрый день!
На днях я столкнулся с поведением finally в php версии 5.5 которого не ожидал и, думаю, многие о нем не знают.
Суть ошибки в следующем. У нас есть блок try-finally. В try бросается Exception. Далее в finally выполняется код бросающий в процессе свой Exception и ловящий его. При этом первый Exception, который должен вылететь из try, забывается.
Под катом рафинированный пример ошибки и пара выводов о возможности использования finally в 5.5.
try {
try {
echo "1n";
throw new Exception("E1");
} finally {
try {
echo "2n";
throw new Exception("E2");
} catch (Exception $e) {
echo "3n";
}
}
echo "4-n";
} catch (Exception $e) {
echo "4+".$e->getMessage()."n";
}
echo "5n";
В 5.6 результат ожидаемый: 1 2 3 4+E1 5.
В 5.5 же к моему удивлению я получил 1 2 3 5
(результаты выполнения можно посмотреть на 3v4l.org [1])
Ошибку я накануне завел [2] в bugs.php.net и уже успел получить следующий ответ:
the problem is because, after finally supporting was merged into 5.5. we did a refactor to it for performance……
and in the new implementation, we need a extra field in EG to fix this issue, which will break ABI compitiable, thus is not allowed to merge into 5.5
Т.е. в моем вольном переводе получается что проблема связана с тем что после того как finally был добавлен в 5.5 его отрефакторили для улучшения производительности и в новой реализации необходимо дополнительное поле EG что бы исправить ошибку, но это ломает API что для уже запатченной 18-ть раз 5.5 сделать нельзя.
Следующие выводы можно сделать из сложившихся обстоятельств:
UPD если про эту ошибку сейчас забудут что более чем вероятно, то она скорее всего всплывет когда фреймворки перестанут поддерживать версию 5.4, но ещё будут поддерживать 5.5 и начнут активано использовать долгожданный finally.
Сам я эту её поймал когда у меня кусок кода работал по разному в зависимости от того использовал ли я в finally logger или нет. Моему удивлению не было предела и я перебрал весь Monolog пока не нашел что дело в самописному адаптере пишущем логи в базу и ловящем ошибки при записи. И даже в этом случае я не сразу стал верить что дело в php и область поиска бага постепенно сужал пока не свёл к коду, написанному в этой заметке выше :)
Автор: AlexeyDsov
Источник [3]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/php-2/71163
Ссылки в тексте:
[1] 3v4l.org: http://3v4l.org/n1bQE
[2] завел: https://bugs.php.net/bug.php?id=68165
[3] Источник: http://habrahabr.ru/post/239435/
Нажмите здесь для печати.