Почему я не люблю логику на исключениях
Feb. 15th, 2012 11:41 amОдин жабист утверждает что исключения надо ловить и обрабатывать, а не дать им нахрен свалится в корень вызова и пусть тот, кто вызывает, разбирается. Ну в жабе по другому сложнее, это понятно.
Но я не люблю обрабатывать исключения самостоятельно, за исключением "вывел в лог с данными приведшими к исключению и кинул дальше".
Потому что в таком случае баги становятся расходящимися. Хороший баг - это когда ВСЕ СДОХЛО, КОРОВЫ, ЗАБОРНИКИ, СТЕКТРЕЙС, МЯСО КРОВЬ КИШКИ. Умирает от входа. Сразу видно, где что надо исправлять.
А плохой баг: это когда он был, но мы его не видели, иначе как чтением логов каждый день за чаем. А хуже того - если мы исключение от него перехватили и пошли работать дальше, а в состоянии программы уже поселилось маленькое скрытое червие которое потом дальше где-нибудь приведет к еще худшим, уже непонятным ошибкам. Впрочем, такое редко бывает, если корректно работать - транзакции там при ошибках откатывать, внешние ресурсы закрывать в finally и вообще возвращаться в корректное состояние.
Но лучше все-таки вернутся в корректное состояние в finally, отписаться в лог в catch и бросить исключение дальше - пусть главный цикл оконных сообщений или там веб-сервер разбирается, у него голова больше.
Но я не люблю обрабатывать исключения самостоятельно, за исключением "вывел в лог с данными приведшими к исключению и кинул дальше".
Потому что в таком случае баги становятся расходящимися. Хороший баг - это когда ВСЕ СДОХЛО, КОРОВЫ, ЗАБОРНИКИ, СТЕКТРЕЙС, МЯСО КРОВЬ КИШКИ. Умирает от входа. Сразу видно, где что надо исправлять.
А плохой баг: это когда он был, но мы его не видели, иначе как чтением логов каждый день за чаем. А хуже того - если мы исключение от него перехватили и пошли работать дальше, а в состоянии программы уже поселилось маленькое скрытое червие которое потом дальше где-нибудь приведет к еще худшим, уже непонятным ошибкам. Впрочем, такое редко бывает, если корректно работать - транзакции там при ошибках откатывать, внешние ресурсы закрывать в finally и вообще возвращаться в корректное состояние.
Но лучше все-таки вернутся в корректное состояние в finally, отписаться в лог в catch и бросить исключение дальше - пусть главный цикл оконных сообщений или там веб-сервер разбирается, у него голова больше.
no subject
Date: 2012-02-15 10:03 am (UTC)Во-вторых, проблему определения точки обработки исключения никто окончательно не решил (на любом языке), это эвристическая инженерная задача, иногда очень сложная из-за дополнительных требований типа "спросить у юзера, если не против, то проигнорировать 1 ошибку в пакете и продолжить дальше." Мир вообще местами сложен. Если вам какой-то пионер советует всегда сразу ловить и сразу обрабатывать все исключения -- ну пометьте себе, что он иногда гонит туфту.
В-третьих, а какая альтернатива исключениям? errno?
no subject
Date: 2012-02-15 10:38 am (UTC)no subject
Date: 2012-02-15 11:46 am (UTC)no subject
Date: 2012-02-15 10:41 am (UTC)Я обычно делаю так: для заведомых ошибок - исключения. Пусть валится.
Для исключений "не у меня" - перехват и далее - или выброс дальше, или же обработка и код возврата.
Для операций, которые по определению могут быть ошибочными (пользователь ввел не тот пароль) - код возврата.
Коды возврата офомлены методом "имитируем хаскель на java/c#" - базовый класс-генерик с двумя наследниками - один сигнализирует об ошибке и тащит с собой информацию о ней, второй об удаче и тащит с собой результат. В параметрах класса-генерика - тип для удачного результата, и тип для неудачного результата.
no subject
Date: 2012-02-15 11:29 am (UTC)no subject
Date: 2012-02-15 11:46 am (UTC)Иногда исключение, иногда сообщение для пользователя читабельное, все равно на уровне GUI никто не знает что с этой ошибкой делать, кроме "показать сообщение пользователю и повторить попытку".
no subject
Date: 2012-02-15 11:47 am (UTC)no subject
Date: 2012-02-15 11:58 am (UTC)