1. defer
특정 문장 혹은 함수를 defer를 호출하는 함수가 return하기 직전에 실행하게 한다.
package main
import "os"
func main() {
f, err := os.Open("1.txt")
if err != nil {
panic(err)
}
// main 마지막에 파일 close 실행
defer f.Close()
// 파일 읽기
bytes := make([]byte, 1024)
f.Read(bytes)
println(len(bytes))
}
2. panic
함수를 즉시 멈추고 defer를 모두 실행한 뒤 즉시 리턴. 이것은 콜스택을 따라 상위함수에도 모두 적용. 마지막에는 프로그램이 에러를 내고 종료된다.
package main
import "os"
func main() {
// 잘못된 파일명을 넣음
openFile("Invalid.txt")
// openFile() 안에서 panic이 실행되면
// 아래 println 문장은 실행 안됨
println("Done")
}
func openFile(fn string) {
f, err := os.Open(fn)
if err != nil {
panic(err)
}
defer f.Close()
}
3. recover
panic 상태를 다시 정상으로 돌리는 함수.
package main
import (
"fmt"
"os"
)
func main() {
// 잘못된 파일명을 넣음
openFile("Invalid.txt")
// recover에 의해
// 이 문장 실행됨
println("Done")
}
func openFile(fn string) {
// defer 함수. panic 호출시 실행됨
defer func() {
if r := recover(); r != nil {
fmt.Println("OPEN ERROR", r)
}
}()
f, err := os.Open(fn)
if err != nil {
panic(err)
}
defer f.Close()
}