Подтвердить что ты не робот

Когда использовать os.Exit() и panic() в Голанге?

Может ли кто-нибудь объяснить ключевые различия между os.Exit() и panic() и как они используются на практике в Голанге?

4b9b3361

Ответ 1

Прежде всего, всякий раз, когда у вас есть вопрос "как он используется на практике", хороший способ начать - search исходный код Go ( или любой достаточно большой базовый код кода), и docs для ответов.

Теперь os.Exit и panic сильно отличаются. panic используется, когда программа или ее часть достигли состояния, не подлежащего восстановлению.

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

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

В большинстве случаев вы не будете использовать panic (вместо этого вы должны вернуть error), и вам почти никогда не нужно os.Exit за пределами некоторых случаев в тестах и ​​для быстрого завершения программы.

Ответ 2

Прежде всего, os.Exit() можно использовать для выхода из программы, как правило, без ошибок, и паники нет, так что одно ключевое различие. Другим является то, что паника где-то может быть поймана и проигнорирована или зарегистрирована с помощью recover.

Но если мы говорим об ошибочном коде выхода, скажем:

Используйте panic, когда что-то идет ужасно неправильно, возможно, ошибка программиста, которую следовало поймать, прежде чем приступить к производству. Вот почему он печатает стек.

Используйте os.Exit(errorCode) или что-то в этом роде, если вы хотите:

  • управлять кодом выхода программы для создания сценариев.

  • требуется упорядоченный выход из ожидаемой ошибки (например, ошибка ввода пользователя).

Итак, в основном паника для вас, плохой код выхода для вашего пользователя.