Обработка ошибок MySQL

Вурдалак

Продвинутый новичок
Я, правда, совершенно не понимаю, нафига это делать. Ладно какой-нибудь дефолтный bugsnag/sentry адаптер с подключением по принципу "сунул в композер и все".
Но чем не устраивает что-то совершенно банальное вида
PHP:
try {
    $this->run();
} catch (\Exception $e) {
    $this->handleException($e);
}
я не понимаю.
Ну, собственно, я про то же. Явный очевидный способ.

Это как писать $a->setFoo(42), $a->bar() вместо более явного $a->bar(42). А потом сидеть и удивляться, если кто-то такой же умный где-то внутри переопределил этот «глобальный» обработчик. Зачем иметь состояние, когда его можно не иметь?
 
Последнее редактирование:
  • Like
Реакции: AmdY

Вурдалак

Продвинутый новичок
Ты в CLI тоже показываешь HTML-страницу, что что-то там недоступно?
кто-то такой же умный где-то внутри не переопределил этот «глобальный» обработчик
В догонку: такое вполне реально, если из CLI по какой-то причине выполнить виртуальный HTTP-запрос.
 

Фанат

oncle terrible
Команда форума
$this->handleException($e);
Проблема (помимо прочих) здесь очень простая - ты низводишь исключение до уровня тупой ошибки, отрубая одну из главных фич - возможность поймать где угодно, а не только по месту порождения.
 

Фанат

oncle terrible
Команда форума
Это из разряда «на всякий случай»?
совершенно верно.
однако если ты для себя почитаешь более идеологически правоверным использовать для такого случая настройки веб-сервера. я признаю за тобой такое право.
 

fixxxer

К.О.
Партнер клуба
И чем же try-catch, написанный в самом начале, отличается от set_exception_handler, написанного в самом начале?

Единственное отличие, которое я вижу - это всякие костыли типа shutdown functions и прочей ереси. Костыль для других костылей.
 

Вурдалак

Продвинутый новичок
совершенно верно.
однако если ты для себя почитаешь более идеологически правоверным использовать для такого случая настройки веб-сервера. я признаю за тобой такое право.
Принцип «на всякий случай» в программировании (да и не только, наверное) неизбежно ведёт к провалу. Нужно точно понимать, что ты делаешь. *Постучал по дереву на всякий случай*
 

Фанат

oncle terrible
Команда форума
Принцип «на всякий случай» в программировании (да и не только, наверное) неизбежно ведёт к провалу. Нужно точно понимать, что ты делаешь. *Постучал по дереву на всякий случай*
ну то есть ты предлагаешь натыкать везде трай-кетчей?
 

Вурдалак

Продвинутый новичок
ну то есть ты предлагаешь натыкать везде трай-кетчей?
Что значит «везде»? Ровно в том же одном месте, где ты «натыкал» set_exception_handler. Задумайся над этим:
И чем же try-catch, написанный в самом начале, отличается от set_exception_handler, написанного в самом начале?
 

fixxxer

К.О.
Партнер клуба
ну то есть ты предлагаешь натыкать везде трай-кетчей?
Не везде, а один раз.

Если, конечно, у тебя не код 15-летней давности, без единой точки входа и с инклюдами в начале каждого файла. Ну так я сразу оговорился насчет легаси (upd: упс, про легаси - это в соседней теме, ну неважно, не вижу смысла такое вообще обсуждать в любом случае).
 

Фанат

oncle terrible
Команда форума
Не везде, а один раз.
Ну короче это спор о том, как регистьрировать централизованный обработчик - либо инклюдить и вызывать функцию с ним в глобальном трай-кетче в бутстрапе, либо инклюдить и регистрировать ее в хендлере там же. так?

просто меня сбивает с толку $this->handleException($e); в твоем примере. Если это глобальный трай кетч для всего кода, то откуда там $this?
 

fixxxer

К.О.
Партнер клуба
откуда там $this?
Ну, например:
PHP:
class Application
{
    public function execute()
    {
        try {
            $this->run();
        } catch (\Exception $e) {
            $this->handleException($e);
        }
    }

    private function run()
    {
          ...
    }
}
Вообще, когда я делаю "с нуля" (на php такое почти никогда, а вот на nodejs/typescript за отсутствием нормальных фреймворков регулярно случается), во входном файле у меня обычно что-то такое:

PHP:
require __DIR__ . '../vendor/autoload.php';
Application::start();
Соответственно, $this относится к приложению.
 

Вурдалак

Продвинутый новичок
Ну короче это спор о том, как регистьрировать централизованный обработчик
Весь спор о том использовать глобальное состояние или сделать более явно, без состояния и магии. Обязательный аргумент очевиднее необязательного со значением по умолчанию. Stateless сервис проще stateful. Проще приклеить этикетку к сосуду с жидкостью, а не хранить её в ящике отдельно. Предпочитай явное неявному. Ведь всё это одно и то же.

Никто, пожалуй, от set_exception_handler не умрёт, но мотивация использовать это мне совершенно неясна. Мы всё-таки не богословы и в наших действиях должен быть какой-то смысл.
 

Adelf

Administrator
Команда форума
Недавно дебажил одно чудо. как-то неправильно приложение реагировало на ошибку. А там оказывается кто-то умный перекрывал стандартный set_exception_handler :) и было весьма непросто найти это место. С try catch хотя бы можно по коллстеку пройти и посмотреть что и как.
 
Сверху