Пользовательский тип исключения - "саморегистрация" - это плохо?


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

Я бы подумал, что это плохо - не так ли?

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

3 2

3 ответа:

Я бы сказал, что это, вероятно, плохо. Это напоминает мне какой - то код, который я читал, что коллега написал некоторое время назад-в методе public helper, вместо того, чтобы выбрасывать исключение, они сделали MessageBox.Show () с сообщением об ошибке. Это было довольно плохо по нескольким причинам, одна из которых заключалась в том, что я хотел использовать метод, не показывая глупую ошибку пользователю.

Лично мне нравится контролировать, регистрирует ли метод информацию или нет (по большей части). Что, если я хочу справиться с этим? исключение таким образом, чтобы не загромождать мои файлы журнала?

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

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

Сообщество C++ обсуждало правильный способ обработки исключений во время построения навсегда. Проблема в том, что если вы бросаете что-то в конструктор, это должно означать, что вы не смогли построить объект. Если вместо этого код просто отмечает, что все было неоптимально, но строительство продолжалось, это должно быть сделано каким-то другим способом. Это вызоветне использовать исключения для потока управления антипаттерн.

Я думаю, что это плохо. Почему бы не использовать unhandled exception eventhandler, чтобы поймать их всех и сделать соответствующие записи там? То, как вы его описываете, нарушает принцип единой ответственности (SRP), а также помните, что исключения сериализуемы, поэтому, например, если вы создаете исключение в контексте службы (например, Служба WCF), а затем передаете его клиенту (веб-приложение/настольное приложение), где должно происходить протоколирование? Вопросы/Проблемы, подобные этому, говорят мне, что лучше всего отделите ведение журнала от исключения и держите их отдельно.