Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- Sync
- go
- windows
- File
- Golang
- GO 언어
- Close
- c++
- write
- channel
- json
- Python
- tcp
- range
- JavaScript
- Linux
- 리뷰
- package
- http
- API
- window
- install
- Callback
- go언어
- mutex
- bitcoin
- 책
- 영화
- C
- FOR
Archives
- Today
- Total
Code Habit
Go ) 패닉과 복구 본문
프로그램이 잘못되어 에러가 발생한 뒤 종료되는 상황을 패닉이라고 한다.
a := [...]int{1, 2}
for i := 0; i < 3; i++ { // i는 0, 1, 2 까지 증가
fmt.Println(a[i]) // 배열의 인덱스는 0, 1까지만 있으므로
} // 배열을 벗어난 접근을 하게 됨
// 실행 결과
1
2
panic: runtime error : index out of range
잘못된 부분으로 인해 발생하는 Go 언어 런타임 에러뿐만 아니라 panic 함수를 사용하면 사용자가 직접 에러를 발생시킬 수도 있다.
- panic(에러 메시지)
func main() {
panic("Error !!")
fmt.Println("Hello, world!") // 실행되지 않음
}
// 실행 결과
panic: Error !!
recover 함수를 사용하면 패닉이 발생했을 때 프로그램이 바로 종료되지 않고 예외 처리를 할 수 있으며 다른 언어의 try catch 구문과 비슷하게 동작한다.
- 변수 := recover()
func f() {
defer func() { // recover 함수는 지연 호출로 사용해야 함
s := recover() // 패닉이 발생해도 프로그램을 종료하지 않음
// panic 함수에서 설정한 에러 메시지를 받아옴
fmt.Println(s)
}()
panic("Error !!!") // panic 함수로 에러 메시지 설정, 패닉 발생
}
func main() {
f()
fmt.Println("Hello world!") // 패닉이 발생했지만 계속 실행됨
}
// 실행 결과
Error !!!
Hello world!
panic 함수 사용이 아닌 실제 런타임 에러 상황에서도 recover 함수를 사용하면 프로그램이 종료되지 않고 계속 실행한다.
func f() {
defer func() {
s := recover() // recover 함수로 런타임 에러(패닉) 상황을 복구
fmt.Println(s)
}()
a := [...]int{1, 2}
for i := 0; i < 5; i++ { // 배열 크기를 벗어난 접근
fmt.Println(a[i])
}
}
func main() {
f()
fmt.Println("Hello, world!") // 런타임 에러가 발생했지만 recover 함수로
// 복구되었기 때문에 정상적으로 실행됨
}
// 실행 결과
1
2
runtime error : index out of range
Hello, world!