Ошибки
Там, где Java обычно использует исключения, Go имеет два разных механизма:
- большинство функций возвращают ошибки;
- только действительно невосстановимые условия, такие как индекс вне допустимого диапазона, создают исключения во время выполнения.
Многозначный возврат Go позволяет легко вернуть подробное сообщение об ошибке вместе с обычным возвращаемым значением. По соглашению такие сообщения имеют тип error, простой встроенный интерфейс.
type error interface {
Error() string
}
Например, функция os.Open возвращает ненулевое значение ошибки, когда не удается открыть файл.
func Open(name string) (file *File, err error)
В следующем коде для открытия файла используется os.Open. Если возникает ошибка, он вызывает log.Fatal, чтобы распечатать сообщение об ошибке и остановиться.
f, err := os.Open("filename.ext")
if err != nil {
log.Fatal(err)
}
// что-то делаем с открытым *File f
Интерфейс error требует только метода Error, но конкретные реализации ошибок часто имеют дополнительные методы, позволяющие вызывающим абонентам проверять подробности ошибки.
Паника и восстановление
Паника (panic) - это ошибка времени выполнения, которая раскручивает стек горутины, по пути запускает любые отложенные функции, а затем останавливает программу.
Паники похожи на исключения Java, но предназначены только для ошибок времени выполнения, таких как переход по нулевому указателю или попытка индексирования массива за пределами границ. Для обозначения таких событий, как конец файла, программы Go используют встроенный тип error, как описано выше.
Встроенную функцию recover можно использовать для восстановления контроля над паникующей горутиной и возобновления нормального выполнения:
- вызов recover останавливает раскрутку и возвращает аргумент, переданный панике.
Поскольку единственный код, который выполняется при раскручивании, находится внутри отложенных (defer) функций, recover полезно только внутри отложенных функций. Если горутина не паникует, recover возвращает nil.
Читайте также:
- Go для Java разработчиков: Hello world пример
- Go для Java разработчиков: основные отличия Go
- Go для Java разработчиков: синтаксис
- Go для Java разработчиков: константы, структуры, указатели
- Go для Java разработчиков: срезы, создание значений
- Go для Java разработчиков: методы и интерфейсы
- Defer, Panic, и Recover в Golang
Комментариев нет:
Отправить комментарий