Skip to content

Горутины: паника и восстановление

Go не поддерживает создание и перехват исключений, вместо этого в программировании на Go предпочтительнее использовать явную обработку ошибок. На самом деле, Go поддерживает механизм, аналогичный броску/перехвату исключений. Механизм называется паника/восстановление.

Мы можем вызвать встроенную функцию panic для создания паники, чтобы текущая горутина перешла в состояние паники.

Паника — это еще один способ вернуть функцию. Как только в вызове функции возникает паника, вызов функции немедленно возвращается и переходит в фазу выхода.

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

Если паникующая горутина завершится без восстановления, это приведет к сбою всей программы.

Встроенные функции и объявлены panic как recover.

Сейчас нам нужно понимать, что пустой тип интерфейса interface{} можно рассматривать как any тип или Object тип во многих других языках. Мы можем передать значение любого типа в panic вызов функции.

Значение, возвращаемое recover вызовом функции, является значением, panic потребляемым вызовом функции.

В приведенном ниже примере показано, как создать панику и как от нее избавиться.

Пришло время поработать с кодом!

Результат.

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

Пришло время поработать с кодом!

Результат.

Среда выполнения Go создаст панику при некоторых обстоятельствах, например при делении целого числа на ноль. Например.

Пришло время поработать с кодом!

Результат.

Как правило, паники используются для логических ошибок, таких как ошибки человека по невнимательности. Логические ошибки никогда не должны возникать во время выполнения. Если они случаются, в коде должны быть ошибки. С другой стороны, нелогических ошибок трудно полностью избежать во время выполнения. Нелогические ошибки — это ошибки, происходящие в реальности. Такие ошибки не должны вызывать паники и должны быть явно возвращены и должным образом обработаны.

Некоторые фатальные ошибки не являются паникой и не восстанавливаются

Для стандартного компилятора Go некоторые фатальные ошибки, такие как переполнение стека, нехватка памяти, конкурентная запись в map, не подлежат восстановлению. Как только они произойдут, программа рухнет.

С оригиналом статьи ты можешь ознакомиться по ссылке.

Изучи дополнительные материалы для того, чтобы углубиться в тему: