Обрабатывать / регистрировать исключения, которые обнаруживаются во всем приложении - PullRequest
0 голосов
/ 10 марта 2020

В настоящее время я поддерживаю приложение с большой базой кода. Приложение находится в стадии разработки.

Моя цель - записать в журнал все исключения, которые вызываются в приложении. Также те, которые попали в блок try try. Из-за большой базы кода я не могу добавить отдельные строки кода в блоки catch или создать свой собственный класс исключений.

Способ, которым я пытался это решить, или искать решение:

  • Прослушайте конструкцию класса во всем приложении
  • Переопределите класс Exception (не могу этого сделать, потому что это базовый php класс)

Мой последний код Я попробовал следующее: мое тестовое исключение (dashboardcontroller.php)

try {
        throw new \Exception('custom thrown exception');
    } catch (\Exception $e) {
        Log::info('Exception caught');
    }

Exceptions\Handler.php

public function report(Exception $exception)
    {
        Log::info($exception);
        parent::report($exception);
    }

Log

[2020-03-10 17:19:09] local.INFO: Exception caught

Итак, вопрос : Как я могу регистрировать / обрабатывать выданные исключения, которые перехвачены в блоке try catch, без добавления кода, который требует большого количества изменений?

1 Ответ

0 голосов
/ 11 марта 2020

Краткий ответ: Вы не можете (насколько я знаю, это так) .

Исключения, которые обычно вылавливаются, обычно перехватываются по причине ; они обрабатываются (или: они должны быть) в операторе catch (т.е. обработчик исключений). Это необученные исключения, которые вы хотите регистрировать.

Исключения никогда не должны использоваться для выполнения программы, но это происходит в любом случае, а иногда и по уважительной причине:

if (fileExists('foo.txt')) {
  fileDelete('foo.txt'); // May result in a race-condition
}

Vs:

try {
  fileDelete('foo.txt')
catch (IOException) {
  // NO-OP
}

Еще один распространенный паттерн:

while (true) {
  try {
    item = queue.Receive(10); // Wait max. 10 seconds
    process(item);            // Process item
  } catch (TimeOutException) {
    // Nothing on queue, handle other stuff and then continue waiting...
    DoStuff();
  }
}

Выше паттерны довольно распространены. Опять же: исключения не должны использоваться для выполнения программы, и приведенный выше пример очереди, конечно, не должен существовать, но реальность такова, что это происходит. Реальные приложения, библиотеки, API и т. Д. c. иногда просто работаю таким образом, и как только вы имеете дело с сторонними приложениями, библиотеками или API, у вас возникают проблемы, потому что вы не всегда можете изменить все на то, что вы бы хотели это будет.

Можете ли вы представить свой лог-файл в приведенном выше примере очереди с вашим 'обобщенным c приложением logger catch для приложения' для приложения, работающего 24/7?

Когда протоколировать исключение (и, возможно, столь же важно: что регистрировать) следует рассматривать в каждом конкретном случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...