Проверка ошибки в Go
Опасный участок можно не ронять всю программу.
После вызова с парой результатов проверяют
ошибку: если err не равен nil,
операция сорвалась. Успех означает err == nil:
package main
import (
"errors"
"fmt"
)
func itemAt(nums []int, index int) (int, error) {
if index < 0 || index >= len(nums) {
return 0, errors.New("bad index")
}
return nums[index], nil
}
func main() {
nums := []int{1, 2, 3}
val, err := itemAt(nums, 10)
if err != nil {
fmt.Println("failed")
} else {
fmt.Println(val)
}
}
Обратимся к элементу среза по неверному индексу
через функцию с проверкой границ. Без проверки
err программа выведет только сообщение
о сбое:
Запишем ту же схему для допустимого индекса.
Ветка с if err != nil пропускается,
выполнение идет дальше, как после обычной
команды:
package main
import (
"errors"
"fmt"
)
func itemAt(nums []int, index int) (int, error) {
if index < 0 || index >= len(nums) {
return 0, errors.New("bad index")
}
return nums[index], nil
}
func main() {
nums := []int{5, 6, 7}
val, err := itemAt(nums, 0)
if err != nil {
fmt.Println("failed")
} else {
fmt.Println(val)
}
fmt.Println("done") // выведет done
}
Переменная err хранит значение типа
error. Его можно вывести или передать
дальше; текст сообщения разберем отдельно.
Дан срез целых чисел из трех элементов.
Выведите элемент с индексом 10 через
функцию с парой результатов. Если обращение
сорвалось, выведите "failed".
Дан срез целых чисел. Запросите у пользователя
индекс. Получите элемент по этому индексу
функцией с ошибкой. При сбое выведите
"failed".
Дан следующий код:
<~show~> <+go+> package main import ( "errors" "fmt" ) func lenWord(str string) (int, error) { if str == "" { return 0, errors.New("empty") } return len(str), nil } func main() { fmt.Println(lenWord("abc")) fmt.Println(lenWord("")) } <-go-> <-show~>
Проверьте err после каждого вызова.
При сбое выведите "failed", иначе -
длину строки.