Возврат и обработка ошибки
Обработка ошибок — это важная особенность надежного кода. В этом разделе вы добавите немного кода, чтобы функция возвращала ошибку из модуля greetings, а затем обработаете её в вызывающем коде.
-
В файле greetings/greetings.go добавьте выделенный ниже код.
Нет смысла возвращать приветствие, если вы не знаете, кому его адресовать. Возвращайте ошибку вызывающей стороне, если имя пустое. Скопируйте следующий код в greetings.go и сохраните файл.
package greetings import ( "errors" "fmt" ) // Hello returns a greeting for the named person. func Hello(name string) (string, error) { // If no name was given, return an error with a message. if name == "" { return "", errors.New("empty name") } // If a name was received, return a value that embeds the name // in a greeting message. message := fmt.Sprintf("Hi, %v. Welcome!", name) return message, nil }В этом коде вы:
-
Изменяете функцию так, чтобы она возвращала два значения:
stringиerror. Вызывающая сторона проверит второе значение, чтобы увидеть, произошла ли ошибка. (Любая функция Go может возвращать несколько значений. За дополнительной информацией обращайтесь к Effective Go.) -
Импортируете стандартный пакет Go
errors, чтобы вы могли использоватьerrors.Newфункцию. -
Добавляете инструкцию
ifдля проверки недопустимого запроса (пустая строка, где имя должно быть) и возвращаете ошибку, если запрос недействителен. Функцияerrors.Newвозвращаетerrorс вашим сообщением внутри. -
Добавьте
nil(что означает отсутствие ошибки) в качестве второго значения в успешном возврате. Таким образом, вызывающая сторона сможет увидеть, что функция успешно завершилась.
-
Изменяете функцию так, чтобы она возвращала два значения:
-
В файле hello/hello.go обработайте ошибку, возвращаемую функцией
Hello, а также значение без ошибки.Вставьте следующий код в hello.go.
package main import ( "fmt" "log" "example.com/greetings" ) func main() { // Set properties of the predefined Logger, including // the log entry prefix and a flag to disable printing // the time, source file, and line number. log.SetPrefix("greetings: ") log.SetFlags(0) // Request a greeting message. message, err := greetings.Hello("") // If an error was returned, print it to the console and // exit the program. if err != nil { log.Fatal(err) } // If no error was returned, print the returned message // to the console. fmt.Println(message) }В этом коде вы:
-
Настраиваете пакет
logдля вывода имени команды ("greetings: ") в начале сообщений журнала, без отметки времени или информации о файле источника. -
Присваиваете оба значения, возвращаемых функцией
Hello, включаяerror, переменным. -
Измените аргумент функции
Helloс имени Гладис на пустую строку, чтобы вы могли проверить ваш код обработки ошибок. -
Проверяете наличие непустого значения
error. В этом случае нет смысла продолжать. -
Используете функции стандартной библиотеки
log packageдля вывода информации об ошибках. Если вы получаете ошибку, вы используете функциюFatalпакетаlogдля вывода ошибки и завершения программы.
-
Настраиваете пакет
-
В командной строке в директории
helloзапустите hello.go, чтобы подтвердить, что код работает.Теперь, поскольку вы передаёте пустое имя, вы получите ошибку.
$ go run . greetings: empty name exit status 1
Это типичная обработка ошибок в Go: возврат ошибки как значения, чтобы вызывающая сторона могла проверить её.
Далее вы будете использовать Go срез для возврата случайно выбранного приветствия.