Я понимаю, что на этот вопрос уже был дан ответ, но я добавлю это, поскольку он может кому-то помочь:
Мне удалось (непреднамеренно) создать ошибки без фрейма стека из функции, которая использовала свои собственные обработчик ошибок, чтобы поддерживать управление выполнением при вызове потенциально «опасной» функции, например:
// Assume the function my_error_handler() has been defined to convert any
// PHP Errors, Warnings, or Notices into Exceptions.
function foo() {
// maintain control if danger() crashes outright:
set_error_handler('my_error_handler');
try {
// Do some stuff.
$r = danger();
} catch (Exception $e) {
$r = 'Bad Stuff, Man!';
}
restore error_handler();
return $r;
}
В конце выполнения программы произошел «непрослеживаемый сбой» если логика в «Do some stuff» возвращается из foo () напрямую, минуя вызов функции restore_error_handler (). То, что я убрал из опыта, следующее:
Это была сложная ошибка для изоляции - Я в основном сузил проблему до указанной выше функции, а затем смотрел на нее, пока мои глаза не кровоточили.
Итак, как бы я отследил это, зная, что я знаю сейчас? Поскольку я не знаю, как можно напрямую проверять «стек» обработчика ошибок PHP, я думаю, что имеет смысл использовать объект Singleton для инкапсуляции всех операций set / restore для обработчиков ошибок PHP. По крайней мере, тогда можно было бы проверить состояние Singleton перед выходом из программы в обычном режиме, и если обнаружены «оборванные» обработчики ошибок, чтобы генерировать разумное сообщение об ошибке / предупреждении до того, как PHP выйдет из игры.
Вы можете добиться того же, просто используя функцию php round()
, как показано ниже:
function round_price_product( $price ){
// Return rounded price
return round( $price );
}
Надеюсь, что это сработает для вас.