Что за чудеса творится с исключениями php?

Здравствуйте!

В общем наткнулся на один довольно интересный момент связанный с исключениями в php , взгляните на код:
try{
echo 1/0;
}catch(Exception $e){
	echo 111;
}

Вывод этого кода такова: (проверил на phpfiddle.org)
E_WARNING : type 2 -- Division by zero -- at line 4


Тогда как я ожидал что вывод будет: 111.

Этот кусок кода тоже не соответствует моим ожиданиям:
<?php
function ogo($e){
	echo "log: " . $e->getMessage() . "\n";
}
set_exception_handler('ogo');

echo 1/0;
?>

Вполне вероятно я тут чего-то не понимаю: но почему этот маленький кусок кода не работает?
  • Вопрос задан
  • 2423 просмотра
Пригласить эксперта
Ответы на вопрос 4
@Nc_Soft
Потому что варнинг это не исключение..
upd
<?php
set_error_handler("warning_handler", E_WARNING);

echo 1/0;

function warning_handler($errno, $errstr) { 
	throw new Exception($errstr);
}
Ответ написан
socengel
@socengel
7 лет native php в продакшене, онлайн 20000+,
Ошибка != Исключение. Это 2 разные сущности.

set_error_handler() посмотрите.

catch(Exception $e) - создаете ошибку а ловите исключение. чтобы поймать исключение нужно его выбросить через throw

ваш код правильнее будет выглядеть так
try{
   $a = 1;
   $b = 0;

   if ($b != 0){
       echo $a/$b;
   }
   else {
       throw new Exeption('Division by zero');
   }
} catch(Exception $e){
  echo 111;
}
Ответ написан
OlegLazarenko
@OlegLazarenko
Деление на ноль генерирует ошибку, а не исключение.
Если нужно что бы генерировало - обрабатывайте сами.

$callback = function() {
    throw new Exception('Деление на ноль') ;
};
set_error_handler($callback);
echo 1/0;
Ответ написан
OnYourLips
@OnYourLips
Нужно все ошибки преобразовывать в исключения через set_error_handler.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
11 авг. 2020, в 00:34
10000 руб./за проект
10 авг. 2020, в 23:01
1500 руб./за проект
10 авг. 2020, в 19:19
20000 руб./за проект