Golang defer๊ณผ panic - Go series(12)
Categories: Golang
์ง์ฐ์คํ์ ํด์ฃผ๋ defer
defer ํค์๋๋ ํน์ ๋ฌธ์ฅ ๋๋ ํจ์๋ฅผ ๋์ค์ ์คํ๋๊ฒ ํ๋ค.(ํธ์ถ ๋ ํจ์์ ๋ง์ง๋ง์ ์คํ๋๋ค) ์ผ๋ฐ์ ์ผ๋ก defer๋ C#, java
์์์ finally
์ฒ๋ผ ์ฌ์ฉ๋๋ค.
package main
import "os"
func main(){
read_file,err := os.Open("C:\\g\\a.txt")
if err!=nil{
println(err)
}
defer read_file.Close()
bytes := make([]byte, 1024)
read_file.read(bytes)
println(bytes)
}
panic !?!?
ํ์ฌ ํจ์์ ์คํ์ ์ฆ์ ๋ฉ์ถ๊ณ ํ์ฌ ํจ์ ๋ฐ๋ ๋ด์ ์กด์ฌํ๋ defer์ ๋ชจ๋ ์คํํ๊ณ ์ฆ์ ๋ฆฌํดํ๊ฒ ๋๋ค.
์ด panic์ ํน์ดํ๊ฒ ์์ ํจ์๊น์ง๋ ์ ์ฉ์ด ๋๊ณ ๋ง์ง๋ง์ ํ๋ก๊ทธ๋จ์ด ์๋ฌ๋ฅผ ๋ด๊ณ ์ข
๋ฃํ๊ฒ ๋๋ค.
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()
}
recover! -> ํจ๋์ ๋ฐ๋๋ก
recover์ด defer ์์ ์์ ์์๋ ํ ํจ์๊ฐ ๋๋ ๋ค ์์ ํจ์์์๋ defer๋ง ์คํ๋์ง ์๊ณ ์ผ๋ฐ์ ์ผ๋ก ์งํ์ด ๋๋ค.
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()
}
Leave a comment