Из "97-ми вещей, которые должен знать каждый программист".
Однажды я написал шутливую программку на С++, в которой я с некоторой долей сатиры реализовал следующую концепцию: при помощи множества конструкций
try
...except
по всему коду не дать программе аварийно завершиться. Результат мы назвали "труп, не падающий потому, что он прибит гвоздями к стене".Несмотря на легкомысленность примера, я вынес из него некоторый опыт.
В нашей собственной С++ библиотеке был один класс. Этот класс долгое время страдал от активности многих и многих программистов. Практически каждый оставил в нем свой след. В этом классе содержался код, работающий со всеми исключениями из всех остальных мест. И мы решили (или, скорее, почувствовали - ибо "решили" означает мыслительный процесс сильнее, чем было вложено в этого монстра), что объект этого класса должен жить вечно (или умереть в попытках это сделать).
Для этого мы сплели сеть из множества обработчиков исключений. Мы смешали в кучу как "родные" обработчики, так и обработчики Windows. Когда что-то не работало, мы вызывали это снова и снова. Оглядываясь назад, мне нравится сравнивать написание конструкций
try
...except
, вложенных в другие ветви except
, с решением свернуть с широкой дороги проверенных практик на манящую, но опасную для здоровья узкую тропинку, ведущую непонятно куда. Однако, это уже "здравый смысл постфактум".Не стоит и говорить, что когда в приложении, использующем этот класс, что-то шло не так, то это что-то исчезало ничуть не хуже, чем жертвы мафиозной разборки в порту, не оставляя даже пузырей на поверхности. И даже не вызывая предназначенных для этого отладочных функций, цель которых – записывать информацию о случающихся проблемах. В итоге мы конечно поняли, какую херню мы сделали, и пришли в ужас. Мы заменили этот кошмар на простой и надежный механизм оповещения. Но произошло это после многих и многих сбоев, оставшихся необнаруженными.
Я бы не стал об этом писать, если бы не недавно состоявшийся диалог с челом, чей академический статус должен был говорить "Я знаю лучше". Мы обсуждали Java-код в удаленной транзакции. Он настаивал, что в случае ошибки код должен перехватить исключение и обработать на месте. "И что ему потом с ним делать?" - спросил я, – "Приготовить на ужин?"
Он процитировал правило дизайнера пользовательского интерфейса: "НИКОГДА НЕ ПОЗВОЛЯЙТЕ ПОЛЬЗОВАТЕЛЮ ВИДЕТЬ СООБЩЕНИЕ ОБ ОШИБКАХ", не задумываясь о том, что КАПС и НИКОГДА – не самые лучшие аргументы. Я спросил, не он ли писал софт для банкоматов, "синий экран" которых так любят фоткать и выкладывать в инет, за что получил по голове.
В общем, если вы с ним встретитесь, то улыбайтесь и соглашайтесь со всем, что он говорит, пока будете медленно продвигаться к двери.
С похожей ситуацией сталкиваюсь встречая pl/sql код след. конструкций:
ОтветитьУдалитьbegin
null;/*yor code here*/
exception
when others then/*doesn't matter what error..*/
null;/*do nothing :)*/
end;