# Позвольте трупу упасть

(В оригинале - Don't Nail Your Program into the Upright Position)

> Однажды я написал шутливую программку на С++, в которой я с некоторой долей сатиры реализовал следующую концепцию: при помощи множества try...catch конструкций по всему коду не дать программе аварийно завершиться. Результат мы назвали «труп, не падающий потому, что он прибит гвоздями к стене».

Несмотря на легкомысленность примера, я вынес из него некоторый опыт.

В нашей собственной С++ библиотеке был один класс. Этот класс долгое время страдал от активности многих и многих программистов. Практически каждый оставил в нем свой след. В этом классе содержался код, работающий со всеми исключениями из всех остальных мест. И мы решили, что объект этого класса должен жить вечно (или умереть в попытках это сделать).

Для этого мы сплели сеть из множества обработчиков исключений. Мы смешали в кучу как «родные» обработчики, так и обработчики Windows. Когда что-то не работало, мы вызывали это снова и снова. Оглядываясь назад, мне нравится сравнивать написание конструкций try..catch, вложенных в другие ветви catch, с решением свернуть с широкой дороги проверенных практик на манящую, но опасную для здоровья узкую тропинку, ведущую непонятно куда. Однако, это уже «здравый смысл постфактум».

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

Я бы не стал об этом писать, если бы не недавно состоявшийся диалог с челом, чей академический статус должен был говорить «Я знаю лучше». Мы обсуждали Java-код в удаленной транзакции. Он настаивал, что в случае ошибки код должен перехватить исключение на своей стороне. «И что ему потом с ним делать?» - спросил я, – «Приготовить на ужин?»

Он процитировал правило дизайнера пользовательского интерфейса: «НИКОГДА НЕ ПОЗВОЛЯЙТЕ ПОЛЬЗОВАТЕЛЮ ВИДЕТЬ СООБЩЕНИЕ ОБ ОШИБКАХ», не задумываясь о том, что КАПС и НИКОГДА – не самые лучшие аргументы. Я спросил, не он ли писал софт для банкоматов, «синий экран» которых так любят фоткать и выкладывать в инет, за что получил по голове.

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

Автор оригинала - [Verity Stob](http://programmer.97things.oreilly.com/wiki/index.php/Verity_Stob)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://97-things-every-x-should-know.gitbook.io/97-things-every-programmer-should-know/ru/thing_62.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
