@bedolazhka

Как организовать обработку исключений set_exception_handler() для их красивого вывода пользователю?

set_exception_handler([$this, 'errorHandler']);
public function errorHandler(Error $error) {
    $this->error = $error->getMessage();
    debug($this->error); // своя функция дебага
}

public function signin()
{
    $data = $this->pdo('select id, password_hash from users where login = ? limit 1', [
        $this->login
    ])->fetch();
    if (is_object($data) and password_verify($this->password, $data->password_hash)) {
        if (!is_null($_SESSION['uid'] = $data->id)) {
            return true;
        }
        throw new Error('Что-то пошло не так'); // раньше было return $this->error = 'Что-то пошло не так';
    }
    throw new Error('Данные введены неверно'); // раньше было return $this->error = 'Данные введены неверно';
}

public function signinAction()
{
    if (filter_has_var(INPUT_POST, 'do')) {
        if ($this->mObj->signin() === true) {
            $this->alertRedirect('success', 'Добро пожаловать');
        }
        $this->alertRedirect('danger', $this->mObj->error);
    }
}

Имеем белый экран с надписью, например, "Данные введены неверно".
Согласно докам после вызова обработчика выполнение будет остановлено.
Можно ли как-то воплотить задуманное в жизнь (продолжить выполнение) или долбить везде try/catch/finally?
  • Вопрос задан
  • 145 просмотров
Решения вопроса 2
@OnlyMyQuestion
Нет нельзя. set_exception_handler вызывается после того как происходит необработанное исключение, контекст, естественно, прерывается.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@FanatPHP
Чебуратор тега PHP
"красиво выводить пользователю" надо не исключения, а абстрактный текст "что-то пошло не так". А само исключение должно логироваться. А так же выводиться для программиста в режиме разработки.
Если сообщение надо вывести пользоваелю, то это не исключение. Вот пример нормального (хотя и с минимальной функциональностью PHP exception handler-a

Другое дело что код здесь какой-то странный, и непонятно, как он вообще работает. Почему this? Это вызов внутри метода класса? Что за странная идея устанавливать обработчик ошибок внутри класса? Почему вообще обработчик ошибок устанавливается в каком-то пользовательском классе? А если будет класс Товар - у него тоже будет свой глобальный обработчик ошибок? Зачем бросать исключение если данные введены неверно?
А, главное, какой смысл пихать ошибку в переменную? Что с ней потом делать? Солить на зиму? И да, как правильно написал OnlyMyQuestion, это не будет работать.

Ох. Не посмотрел на юзернейм сначала. Все зря значит писал. Не дойдет.
А жаль. Вопрос-то очень хороший, если его с умом задать.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
АКМЭ сервис Санкт-Петербург
от 120 000 до 150 000 ₽
Директ Кредит Казань
от 70 000 до 120 000 ₽
Технология Тюмень
от 50 000 до 130 000 ₽
07 авг. 2020, в 19:51
2000 руб./за проект
07 авг. 2020, в 19:24
4000 руб./за проект