Ловля исключений php 7.1

310
12 января 2017, 07:56

Есть класс исключения, унаследованный от 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.

Как тогда создавать и отлавливать свои исключения?

Answer 1

Лови исключение как \Exception и смотри, что у тебя там

    try {
        // do something
    } catch(\Exception $e) {
        exit(get_class($e));
    }
READ ALSO
Превью в виде картинки из файла MS Word

Превью в виде картинки из файла MS Word

Здравствуйте, понадобилось сделать превью вордовского файла в виде картинки, что б еще сохранялось форматирование текста

264
Неверно задаю массив в php запросе

Неверно задаю массив в php запросе

Здравствуйте, уважаемые пользователи стакаОшибка состоит с вытягиванием категорий с БД

295
Что такое $_SERVER[&#39;REQUEST_URI&#39;], Почему там полный адрес сторонних сайтов?

Что такое $_SERVER['REQUEST_URI'], Почему там полный адрес сторонних сайтов?

Начал собирать простенькую статистику на сайтеРешил в том числе отслеживать на какой странице именно находится пользователь (по какому...

331