Заставить ZF2 не останавливаться на делении на нулевой запрос

Мое приложение создает динамические отчеты, созданные пользователями, которые могут создавать запросы, которые возвращают деление на ноль.
Когда это происходит, ZF2 ловит это с Zend\Db\Adapter\Exception\InvalidQueryException отобразить исключение и остановить мой скрипт.

Мне нужно продолжить выполнение скрипта, даже когда это произойдет, потому что приложение покажет 0 в этих расчетах и ​​отчет все равно будет показан.

Я уже отключил эти настройки в config/autoload/local.php и я уверен global.php не перезаписывает их:

'phpSettings'   => array(
'display_startup_errors' => false,
'display_errors'         => false,
'error_reporting'        => 0,
),

'view_manager' => array(
'display_not_found_reason' => false,
'display_exceptions'       => false,
),

Сценарий по-прежнему останавливается и показывает мою пользовательскую страницу «ошибки», единственное отличие состоит в том, что он скрывает детали исключений.

Как сохранить работоспособность скрипта / приложения, даже если division by zero происходит?

Я уже видел другие вопросы о display_exceptions=false но, как вы можете видеть, это не помогло мне.

Я бы предпочел решение без внесения изменений в процесс создания запроса, потому что оно очень сложное, но я принимаю все предложения.

0

Решение

Вы можете просто захватить исключение самостоятельно, выполнив попытку поиска по запросу

try {
// try to run the query that might throw the exception.
} catch (\Zend\Db\Adapter\Exception\InvalidQueryException $e) {
// do set the result to zero.
}
1

Другие решения

Рассматривали ли вы в своем сценарии тестирование, если знаменатель равен 0 до это на самом деле рассчитывается? Если это так, вы можете пропустить расчет и сразу вернуть строку или другое число. Таким образом, вы бы избежали деление на ноль ошибка.


пример

function getStatistics($returned_value) {

if ($returned_value  == 0) {

//Cannot compute
return "Impossible";

} else {

//Do the calculation
return 100/$returned_value; //For example

}

}
0

По вопросам рекламы [email protected]