Книга: Программист-прагматик. Путь от подмастерья к мастеру
Аварийное завершение не означает «отправить в корзину для мусора»
Аварийное завершение не означает «отправить в корзину для мусора»
Одним из преимуществ скорейшего обнаружения проблем является то, что аварийное завершение происходит как можно раньше. И во многих случаях такое завершение программы – это лучший выход из положения. Альтернативой может быть продолжение работы, запись поврежденных данных в жизненно важную базу данных или команда стиральной машине на проведение двадцатого по счету цикла отжима.
Эта философия воплощена в языке и библиотеках Java. Когда в системе выполнения случается что-то непредвиденное, происходит возбуждение исключения RuntimeException. Если это исключение не перехвачено, оно будет двигаться на верхний уровень программы и заставит ее прекратить работу, отобразив трассировку стека.
То же самое можно реализовать и на других языках программирования. Если механизм исключения отсутствует или библиотеки не возбуждают исключения, то убедитесь в том, что можете обрабатывать ошибки самостоятельно. В языке С для этого весьма полезны макрокоманды:
#define CHECK(LINE, EXPECTED)
{int rc = LINE;
if (rc!= EXPECTED)
ut_abort(_FILE_, _LINE_, #LINE, rc, EXPECTED); }
void ut_abort(char *file, int In, char *line, int rc, int exp) {
fprintf(stderr, «%s line %dn'%s': expected %d, got %dn», file, In, line, exp, rc);
exit(1);
}
Тогда вы можете инкапсулировать вызовы, которые никогда подведут, с помощью строки:
CHECK(stat("/tmp», &stat_buff), 0);
Если бы это не удалось, то вы бы получили сообщение, записанное в stderr:
source.c line 19
"stat("/tmp», &stat_buff)' : expected 0, got -1
Ясно, что в ряде случаев выход из выполняющейся программы просто не уместен. Возможно, вы претендуете на ресурсы, которые не освобождены, или же вам необходимо записать сообщения в журнал, завершить открытые транзакции или взаимодействовать с другими процессами. Здесь будут полезны методики, обсуждаемые в разделе «Случаи, когда необходимо использовать исключения». Однако основной принцип остается тем же – если ваша программа обнаруживает, что произошло событие, которое считалось невозможным, программа теряет жизнеспособность. Начиная с этого момента, все действия, совершаемые программой, попадают под подозрение, так что выполнение программы необходимо прервать как можно быстрее. В большинстве случаев мертвая программа приносит намного меньше вреда, чем испорченная.
Другие разделы, относящиеся к данной теме:
• Проектирование по контракту
• Когда использовать исключения
- 22 Мертвые программы не лгут
- Что делать, если при установке принтера появляется сообщение Невозможно завершение операции. Подсистема печати недоступн...
- Завершение транзакций
- 1.4.4 Сборка мусора
- Шаг 6 Завершение продажи на кассе, предложение сопутствующих товаров
- Досрочное завершение сервера
- Как узнать, что обозначает неизвестное расширение файла?
- У некоторых сайтов адрес начинается с www. Что это обозначает?
- Как переименовать Корзину?
- Можно ли отредактировать меню Отправить?
- При попытке установить принтер появляется сообщение Невозможно завершение операции. Подсистема печати недоступна. В чем ...
- Как очистить Корзину с помощью командной строки?