Skip to content

Latest commit

ย 

History

History
64 lines (54 loc) ยท 2.97 KB

recover.md

File metadata and controls

64 lines (54 loc) ยท 2.97 KB

๋ณต๊ตฌ(recover)

go์—์„œ๋Š” ํŒจ๋‹‰์— ๊ฑธ๋ฆฌ๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ์ฃฝ์–ด๋ฒ„๋ฆฌ๋Š”๋ฐ ์ด๋ฅผ ์‚ด๋ ค์ฃผ๊ธฐ ์œ„ํ•ด recover๋ฅผ ์‚ฌ์šฉํ•จ๐Ÿ’ซ

1. ํŒจ๋‹‰(panic)

  • ๋Ÿฐํƒ€์ž„ ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ์น˜๋ช…์ ์ธ ์—๋Ÿฌ๋ฅผ ๋œปํ•จ

    ex) ๋ฐฐ์—ด์—์„œ ํ• ๋‹น๋˜์ง€์•Š์€ ์ธ๋ฑ์Šค์— ์ ‘๊ทผํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ

  • ํ”„๋กœ๊ทธ๋žจ์ด ๋” ์ด์ƒ ์‹คํ–‰๋  ์ˆ˜ ์—†๋Š” ์ˆ˜์ค€์˜ ์—๋Ÿฌ๋กœ, ํŒจ๋‹‰์ด ๋ฐœ์ƒํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ์ค‘๋„ ์ข…๋ฃŒ๋˜์–ด๋ฒ„๋ฆผ

    • ์ผ๋ฐ˜์ ์ธ ์—๋Ÿฌ๋Š” ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜์ง€ ์•Š์Œ
    • ํŒจ๋‹‰์ด ๋ฐœ์ƒํ•œ ์‹œ์ ์—์„œ ํ”„๋กœ๊ทธ๋žจ์ด ์ฆ‰์‹œ ๋ฉˆ์ถ”๊ธฐ ๋•Œ๋ฌธ์—, ๊ทธ ์ดํ›„์— ์žˆ๋Š” ๊ตฌ๋ฌธ์€ ์‹คํ–‰๋˜์ง€ ์•Š์Œ
    • ํŒจ๋‹‰์ด ๋ฐœ์ƒํ•˜๋ฉด ์‹คํ–‰์ค‘์ธ ๊ณ ๋ฃจํ‹ด์„ ๋ฉˆ์ถ”๋‚˜, defer๋ฅผ ํ†ตํ•ด ์˜ˆ์•ฝํ•ด๋‘” ํ•จ์ˆ˜๋Š” ํ˜ธ์ถœ์ด ๋ณด์žฅ๋จ
  • ๊ฐœ๋ฐœ์ž๊ฐ€ ํŒจ๋‹‰์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ๋Š๋ผ๋Š” ๋ถ€๋ถ„์— ๋Œ€ํ•ด go ๋นŒํŠธ์ธ ํ•จ์ˆ˜ panic()ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํŒจ๋‹‰์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•จ

2. recover() ํ•จ์ˆ˜

  • ํŒจ๋‹‰์ด ๋ฐœ์ƒํ•ด๋„ recover()ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜๋Š” ๊ฒƒ์„ ๋ง‰๊ณ  ๋ณต๊ตฌ์ด ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ
    • ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜๊ธฐ ์ „, defer() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์˜ˆ์•ฝํ•ด๋‘๋ฉด ํŒจ๋‹‰์ด ๋ฐœ์ƒํ•ด๋„ ํšŒ๋ณต์‹œ์ผœ์คŒ

    • recover() ํ•จ์ˆ˜๋Š” ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋ฏ€๋กœ, ์–ด๋Š๋ถ€๋ถ„์— ๋Œ€ํ•ด ํŒจ๋‹‰์ด ๊ฑธ๋ ธ๋Š”๋ฐ ์—๋Ÿฌ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•ด์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•จ

      func main() {
         arr:= []int{} //๋ฐฐ์—ด arr ์„ ์–ธ
         defer func() {
           r:=recover() //panic๋ฐœ์ƒ์‹œ ๋ณต๊ตฌ์ฒ˜๋ฆฌ
            fmt.Println(recover()) //ํŒจ๋‹‰์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฆฌํ„ด๊ฐ’์€ nil, ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ ์—๋Ÿฌ๋ฉ”์‹œ์ง€ ์ „๋‹ฌํ•ด์คŒ
         }()
      
         x:=arr[4] //๋ฐฐ์—ด arr์˜ ํ• ๋‹น๋˜์ง€ ์•Š์€ ์ธ๋ฑ์Šค์— ๋Œ€ํ•ด ๊ฐ’ ํ˜ธ์ถœ
      }
      

3. defer() ํ•จ์ˆ˜

  • defer๋ฅผ ํ†ตํ•ด ํŠน์ • ๊ตฌ๋ฌธ์„ ํ•จ์ˆ˜ ๋‚ด ๋งˆ์ง€๋ง‰์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•จ
  • defer๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด list ์— ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ๊ธฐ๋กํ•ด์„œ, ์ฃผ๋ณ€ํ•จ์ˆ˜๊ฐ€ ๋ฆฌํ„ด๋œ ์ดํ›„์— ์‹คํ–‰๋จ
  • defer ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•  ๋•Œ์˜ 3๊ฐ€์ง€ ๊ทœ์น™
    • defer์— ๋„ฃ๋Š” ํ•จ์ˆ˜ ์ธ์ž๋Š” defer๊ฐ€ ์‚ฌ์šฉ๋  ๋•Œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ‰๊ฐ€ํ•จ
      func main() {
         i:=10
         defer fmt.Println(i) //i=0์ผ ๋•Œ ํ˜ธ์ถœ๋˜์—ˆ์œผ๋ฏ€๋กœ, ์‚ฌ์šฉ๋  ๋•Œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ i๋ฅผ ํ‰๊ฐ€ํ•ด๋ฒ„๋ฆผ
         i--
         return
      }
      
    • defer๋กœ ๋„ฃ๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ LIFO(Last-Input First-Output) , ์ฆ‰ ์Šคํƒ์— ๋“ค์–ด๊ฐ€ ์‹คํ–‰๋จ
      func main() {
         for i:=0; i<10; i++ {
            defer fmt.Print(i)//์Šคํƒ์˜ ์„ฑ์งˆ ๋•Œ๋ฌธ์—, ์ถœ๋ ฅ์€ "9876543210"
         }
      }
      
    • defer๋กœ ๋„ฃ์€ ํ•จ์ˆ˜๋“ค์€ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์˜ named return value๋ฅผ ์ฝ๊ณ  ํ• ๋‹น ๊ฐ€๋Šฅํ•จ
      func UpValue() (i int) {
         defer func() {
            i++ // UpValue ํ•จ์ˆ˜์˜ ๋ฆฌํ„ด ๊ฐ’ i๋ฅผ ์ฆ๊ฐ€์‹œํ‚ด
         }() // ๋”ฐ๋ผ์„œ 1์„ ๋ฆฌํ„ด์„ ๋จผ์ €ํ•˜๊ณ , ๊ทธ๋‹ค์Œ defer์—์„œ ์ˆ˜ํ–‰๋œ 2๋ฅผ ๋ฆฌํ„ดํ•จ
         
         return 1
      }