Есть класс исключения, унаследованный от Exception:
<?php
namespace core\exception;
class SessionInitException extends \Exception{
public function __construct($message, $code = 0, Exception $previous = null)
{
parent::__construct($message, $code, $previous);
}
}
В некоторых методах происходит "выброс" этого исключения. (Код методов не добавлял, он не важен, просто выбрасывается и все).
Но, при ловле этого exception'a в коде - он не обрабатывается, а просто пропускается и прерывается соответственно программа.
use core\exception;
use types\UserShoppingData;
$user_shopping_data = UserShoppingData::get_instance();
try {
echo json_encode($user_shopping_data->jsonSerialize());
} catch (SessionInitException $six) {
$user_shopping_data->reinit_data();
echo json_encode($user_shopping_data->jsonSerialize());
}
Результатом ловли получается это:
Fatal error: Uncaught core\exception\SessionInitException: Session var's 'isUserCorrect' is not set! in F:\OpenServer\domains\talas-shop.order\application\modules\types\UserShoppingData.php:94
Stack trace:
#0 F:\OpenServer\domains\talas-shop.order\application\modules\types\UserShoppingData.php(179): types\UserShoppingData->get_trash_data()
#1 F:\OpenServer\domains\talas-shop.order\application\processing\service\init_template_data.php(11): types\UserShoppingData->refresh_shopping_data()
#2 {main}
thrown in F:\OpenServer\domains\talas-shop.order\application\modules\types\UserShoppingData.php on line 94
Хотя должна быть обработка исключения.
Если ловить не exception, а уже throwable:
try {
$user_shopping_data->refresh_shopping_data();
echo json_encode($user_shopping_data->jsonSerialize());
} catch (Throwable $t) {
echo "IN THROWABLE CATCH STATEMENT\n";
$user_shopping_data->reinit_data();
echo json_encode($user_shopping_data->jsonSerialize());
} catch (SessionInitException $six) {
$user_shopping_data->reinit_data();
echo json_encode($user_shopping_data->jsonSerialize());
}
Обрабатывается как надо:
IN THROWABLE CATCH STATEMENT
{"favorite_count":0,"favorite_data":[],"trash_count":0,"trash_data":[],"login_state":false}
Реализация метода jsonSerialize():
public function jsonSerialize()
{
return [
'favorite_count' => $this->favorite_count,
'favorite_data' => $this->favorite_data,
'trash_count' => $this->trash_count,
'trash_data' => $this->trash_data,
'login_state' => $this->login_state
];
}
Окей, в документации пишут (цитата делает этот текст не читаемым):
try
{
// Code that may throw an Exception or Error.
}
catch (Throwable $t)
{
// Executed only in PHP 7, will not match in PHP 5
}
catch (Exception $e)
{
// Executed only in PHP 5, will not be reached in PHP 7
}
А на хабре пишут:
Пользовательские классы не могут реализовывать Throwable.
Как тогда создавать и отлавливать свои исключения?
Лови исключение как \Exception и смотри, что у тебя там
try {
// do something
} catch(\Exception $e) {
exit(get_class($e));
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Здравствуйте, понадобилось сделать превью вордовского файла в виде картинки, что б еще сохранялось форматирование текста
Здравствуйте, уважаемые пользователи стакаОшибка состоит с вытягиванием категорий с БД
Начал собирать простенькую статистику на сайтеРешил в том числе отслеживать на какой странице именно находится пользователь (по какому...