PHP — Почему исключения должны быть выброшены вручную?

Я пробовал это в PHP и C ++, поэтому мой вопрос касается только их. Почему мы должны throw исключений, и они не генерируются автоматически при возникновении проблемы исключений.

PHP Code First

<?php
try{
$a=1;
$b=0;
echo $a/$b;
} catch (Exception $e) {
echo "Error : ".$e->getMessage();
}
?>

Почему этот код не создает исключение деления на ноль? Это можно сделать, следуя

<?php
try{
$a=1;
$b=0;
if($b==0)
{
throw new Exception("What's the point in an exception if its not automatic and i have to throw it myself");
}
echo $a/$b;
} catch (Exception $e) {
echo "Error : ".$e->getMessage();
}
?>

Но какой смысл в обработке исключений, если мне приходится самому кодировать возможные исключения, то почему бы не использовать простой шаблон сообщения об ошибках?

То же самое относится и к следующему

C ++ CODE

int main()
{
try{
int a=1;
int b=0;
cout<<(a/b);
}
catch (string e)
{
cout << e << endl;
}
}

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

int main()
{
try{
int a=1;
int b=0;
if(b==0)
{
throw string("What's the point in an exception if its not automatic and i have to throw it myself");
}
cout<<(a/b);
}
catch (string e)
{
cout << e << endl;
}
}

Вопрос

Почему я должен был проверить эти переменные вручную, чтобы поймать ошибку? Действительно ли исключение — исключение, когда я уже говорю коду, что это произойдет? Тогда почему это предпочтительнее, чем основной if условия

0

Решение

<?php

function exception_error_handler($errno, $errstr, $errfile, $errline ) {
throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
}
set_error_handler("exception_error_handler");

try{
$a=1;
$b=0;
echo $a/$b;
} catch (Exception $e) {
echo "Error : ".$e->getMessage();
}

выход:

Error : Division by zero
1

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

Причина, по крайней мере для C ++, заключается в том, что проверка делителя нуля, а затем выбрасывание и обработка исключения могут серьезно повлиять на производительность в некоторых системах. Таким образом, деление на ноль является неопределенным поведением в соответствии со стандартом C ++.

5.6 Мультипликативные операторы

4 Двоичный / оператор дает частное, а бинарный оператор% — остаток от деления
первого выражения вторым. Если второй операнд / или% равен нулю, поведение не определено. За
Интегральные операнды оператор / дает алгебраический фактор с любой отброшенной дробной частью; 81, если
частное a / b представимо в типе результата, (a / b) * b + a% b равно a; в противном случае, поведение
как a / b, так и% b не определены

Некоторые реализации бросают исключения. Но передача этого может привести к неожиданным результатам, если код скомпилирован с другим компилятором. Например, см. SEH в MSVC

5 выражений

4 Если во время оценки выражения результат не определен математически или не находится в диапазоне
представимые значения для его типа, поведение не определено. [Примечание: большинство существующих реализаций C ++
игнорировать целочисленные переполнения. Обработка деления на ноль, формирования остатка с использованием делителя нуля, и все
Исключения с плавающей запятой различаются для разных машин и обычно настраиваются библиотечной функцией.
—Конечная записка]

3

Не могу говорить с PHP, но в C ++ код компилируется в нативный код с инструкциями для процессора. Он не выполняет высокоуровневую обработку, поэтому генерирование исключения не имеет смысла для такой примитивной операции. Кроме того, этот тип проверки будет замедлять математические операции. Недостатком исключений является производительность.

Конечно, возможно, что разработчики PHP не захотели снизить производительность при проверке ошибок ввода и в простых математических операциях.

0

В C / C ++ на операционных системах POSIX (для всех практических целей, все, кроме Windows), сигнал SIGFPE отправляется в приложение всякий раз, когда «выполняется незаконная арифметическая операция» (например, деление на ноль.) signal Системный вызов для установки обработчика для этого.

Однако сигналы отличаются от исключений, и вы не можете просто начать генерировать исключения из обработчиков сигналов — обработчики сигналов выполняются в другом кадре, чем остальная часть кода.

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