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

  • Автор темы Автор темы Zavus
  • Дата начала Дата начала
Я, правда, совершенно не понимаю, нафига это делать. Ладно какой-нибудь дефолтный 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-запрос.
 
$this->handleException($e);
Проблема (помимо прочих) здесь очень простая - ты низводишь исключение до уровня тупой ошибки, отрубая одну из главных фич - возможность поймать где угодно, а не только по месту порождения.
 
Это из разряда «на всякий случай»?
совершенно верно.
однако если ты для себя почитаешь более идеологически правоверным использовать для такого случая настройки веб-сервера. я признаю за тобой такое право.
 
И чем же try-catch, написанный в самом начале, отличается от set_exception_handler, написанного в самом начале?

Единственное отличие, которое я вижу - это всякие костыли типа shutdown functions и прочей ереси. Костыль для других костылей.
 
совершенно верно.
однако если ты для себя почитаешь более идеологически правоверным использовать для такого случая настройки веб-сервера. я признаю за тобой такое право.
Принцип «на всякий случай» в программировании (да и не только, наверное) неизбежно ведёт к провалу. Нужно точно понимать, что ты делаешь. *Постучал по дереву на всякий случай*
 
Принцип «на всякий случай» в программировании (да и не только, наверное) неизбежно ведёт к провалу. Нужно точно понимать, что ты делаешь. *Постучал по дереву на всякий случай*
ну то есть ты предлагаешь натыкать везде трай-кетчей?
 
ну то есть ты предлагаешь натыкать везде трай-кетчей?
Что значит «везде»? Ровно в том же одном месте, где ты «натыкал» set_exception_handler. Задумайся над этим:
И чем же try-catch, написанный в самом начале, отличается от set_exception_handler, написанного в самом начале?
 
ну то есть ты предлагаешь натыкать везде трай-кетчей?
Не везде, а один раз.

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

просто меня сбивает с толку $this->handleException($e); в твоем примере. Если это глобальный трай кетч для всего кода, то откуда там $this?
 
откуда там $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 не умрёт, но мотивация использовать это мне совершенно неясна. Мы всё-таки не богословы и в наших действиях должен быть какой-то смысл.
 
Недавно дебажил одно чудо. как-то неправильно приложение реагировало на ошибку. А там оказывается кто-то умный перекрывал стандартный set_exception_handler :) и было весьма непросто найти это место. С try catch хотя бы можно по коллстеку пройти и посмотреть что и как.
 
Сверху