Почему "журнал и бросок" считается анти-шаблоном? - программирование
Подтвердить что ты не робот

Почему "журнал и бросок" считается анти-шаблоном?

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

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

4b9b3361

Ответ 1

Я предполагаю, что ответ во многом объясняется тем, почему вы его ловите, если не можете справиться с этим? Почему бы не позволить кому бы то ни было справиться с этим (или кому оставлено без выбора, кроме как справиться с ним) запишите его, если они считают, что он является журнальным?

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

Также некоторые могут утверждать, что, поскольку броски и ловушки исключений являются относительно дорогостоящими операциями, все это перехватывание и реинтронирование не помогают вашей производительности во время выполнения. Это также не помогает вашему коду в плане краткости или ремонтопригодности.

Ответ 2

Лог-бросок - хороший шаблон, если у объекта, улавливающего и реконструирующего исключение, есть основания полагать, что он содержит информацию, которая не будет регистрироваться дальше в стеке вызовов - по крайней мере, не самым желаемым образом. Это может привести к двум причинам:

  • Исключение может быть обнаружено и восстановлено на границе прикладного уровня и может содержать привилегированную информацию. Было бы плохо, если бы уровень базы данных позволял исключать высказывание, например. "Попытайтесь добавить дублирующий ключ" fnord "в поле" пользователи "для доступа к внешнему слою приложения (который, в свою очередь, может предоставить его пользователю), но может быть полезно, чтобы внутренние части базы данных выбрали такое исключение и интерфейс приложения, чтобы поймать его, безопасно зарегистрировать его и восстановить несколько менее описательное исключение.
  • Исключение может быть таким, что внешний слой, вероятно, ожидает обработки без ведения журнала, но внутренний уровень может знать что-то, что внешний слой не делает, что может предполагать, что регистрация может быть полезна. В качестве грубого примера можно запрограммировать средний уровень приложения, чтобы попытаться подключиться к одному серверу, и если это не сработает, попробуйте другое. Наводнение журнала приложений с сообщением "не удалось", когда сервер работает для обслуживания, может оказаться нецелесообразным, тем более, что с точки зрения приложения все работает нормально. Может быть полезно перенаправить информацию о сбое подключения к ресурсу регистрации, связанному с серверами, который затем может фильтровать журналы, чтобы создать отчет о том, когда сервер поднимался и опускался, в отличие от журнала каждой попытки подключения,

Ответ 3

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

Аргумент сквозных аргументов в основном состоит в том, что это пустая трата времени на ошибки, которые не касаются вас. Гораздо лучше, чтобы ошибка запустила стек вызовов до тех пор, пока не будет найден соответствующий обработчик.

По-моему, единственный раз, когда вы должны поймать исключение, вы можете сделать что-то полезное с результатами. Ловить просто журнал не полезно, потому что вы можете централизовать эту работу дальше.

Ответ 4

Журнал ИМО и бросок - это явное нарушение Принципа наименьшего удивления.

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