Sobes.tech
Senior

// Сұрақ 2. Экранға не шығады package main import "fmt" func main() { { defer fmt.Println(1) } defer fmt.Println(2) panic("aaaa") defer func(){ if r := recover(); r != nil{ fmt.Println("Паника өңделді", r) } } }

sobes.tech AI

AI-дан жауап

Бұл кодта бірнеше маңызды сәттер бар:

  1. defer fmt.Println(1) блок ішінде шақырылады, бірақ бұл кейінгі шақырылымдардың тәртібіне әсер етпейді — олар стекке қосылады.
  2. Содан кейін defer fmt.Println(2) шақырылады.
  3. Одан кейін panic("aaaa") шақырылады.
  4. panic-тен кейін recover()-ды орындауға тырысатын функциямен defer бар.

Алайда, defer func(){...} panic-тен кейін жарияланған, сондықтан бұл defer ешқашан тіркелмейді, себебі функцияның орындалуы panic-те тоқтайды.

Іске асыру тәртібі:

  • panic шақырылғанда, барлық кейінге қалдырылған шақырылымдар кері тәртіпте орындалады.
  • Алдымен, defer fmt.Println(2) орындалады — шығарады 2.
  • Содан кейін defer fmt.Println(1) орындалады — шығарады 1.
  • defer func(){...} тіркелмеген, себебі ол panic-тен кейін жарияланған.
  • Паника өңделмеген, бағдарлама қате арқылы тоқтайды.

Экранға шығатын нәтиже:

2
1
panic: aaaa

Егер defer func(){...} panic-тен бұрын жарияланған болса, ол паниканы ұстап, "Паника өңделді aaaa" деп шығарар еді.