Введение в аварийный останов в Go
Аварийный останов обрывает обычный ход
программы, когда продолжать уже нельзя. Это
не проверка через if err != nil и
не возврат сбоя из функции: выполнение
текущего участка кода прекращается сразу,
а дальше язык разматывает стек вызовов,
пока кто-то не перехватит останов или
процесс не завершится.
Такой прием нужен, когда внутреннее состояние сломано настолько, что безопаснее остановить ветку целиком, чем тащить дальше неверные данные. В учебных примерах им часто показывают невозможную ситуацию; в реальных программах к нему прибегают реже, чем к обычным ошибкам, но знать правила перехвата все равно важно.
Вы уже работали с отложенным вызовом через
defer и с возвратом ошибок из функций.
Перехват останова опирается на defer:
отложенная функция может снять панику и
вернуть управление вызывающему коду. Без
такого перехвата программа печатает трассировку
и завершается, а строки после места останова
не выполняются.
В этом разделе разберем, как вызвать останов
с коротким сообщением, как перехватить его
и продолжить работу со следующей строки
вызывающего кода, почему перехват действует
только внутри отложенной функции и что
происходит, если останов никто не поймал.
Сначала увидим мгновенное прерывание функции,
затем научимся возвращать управление в
main без падения всей программы.