impressive17
@impressive17

Чему равна переменная r после второго вызова panic?

Есть код
package main

import "log"

func f() {
	defer func() {
		if r := recover(); r != nil {
			log.Printf("recover:%#v", r)
		}
	}()
	panic(1)
	panic(2)
}

func main() {
	f()
}

Как я понимаю первая паникаа обрабатывается корректно, а при вторая уже не обрабатывается, я прав?
  • Вопрос задан
  • 53 просмотра
Решения вопроса 1
EvgenyMamonov
@EvgenyMamonov
Senior software developer, system architect
Выполнение функции f() завершается после первого panic, потом отрабатывает defer.
Второй panic выполнен не будет, т.к. выполнение функции уже завершилось и до него очередь не дойдёт.
Можно добавить немного log.Println в ваш пример и проследить ход выполнения, например вот так
package main

import "log"

func f() {
  defer func() {
    if r := recover(); r != nil {
      log.Printf("recover:%#v", r)
    }
  }()
  log.Println("Start first panic")
  panic(1)
  log.Println("After first panic")
  panic(2)
  log.Println("After second panic")
}

func main() {
  f()
  log.Println("After f()")
}

Вывод будет таким
2020/07/20 23:14:07 Start first panic
2020/07/20 23:14:07 recover:1
2020/07/20 23:14:07 After f()
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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