4utka_pyan
@4utka_pyan

Перехват паники в golang?

Возьмём рабочий скрипт в нём ошибка, в цикле <= вместо просто <
package main
import "fmt"

func main() {
    var x [5]float64
    x[0] = 98
    x[1] = 93
    x[2] = 77

    var total float64 = 0
    for i := 0; i <= 5; i++ {
        total += x[i]
    }
    fmt.Println(total / 3)
}

Ошибка:
panic: runtime error: index out of range
goroutine 1 [running]:
panic (0x4ef600, 0xc082002030)
C:/Go/src/runtime/panic.go:464 +0x3f4
main.main()
C:/Go/test/test.go: 12 +0x199
exit status 2

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

Стало:
package main
import "fmt"

func main() {
    var x [5]float64
    x[0] = 98
    x[1] = 93
    x[2] = 77

    var total float64 = 0
    for i := 0; i <= 5; i++ {
        total += x[i]
    }
    fmt.Println(total / 5)
}

defer func() {    
    str := recover()
    fmt.Println(str)
}()

Но в ответ
#command-line-arguments
.\test.go:18: syntax error: non-declaration statement outside function body
.\test.go:19: syntax error: unexpected str, expecting (
.\test.go:19: method has no receiver
.\test.go:20: syntax error: non-declaration statement outside function body

Т.е. все ошибки связаны как раз с добавленным блоком, а первоначальная ошибка не отображается. Я что-то неправильно сделал и как правильно пользоваться этой функцией?
  • Вопрос задан
  • 987 просмотров
Решения вопроса 1
@rustler2000
погромист сикраш
Defer должен быть внутри main
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы