런타임에서 아래의 함수가 예상치 못한 에러를 발생하는 함수라고 가정하고
실행을 해보면 실행결과 에러
와 같이 출력을 종료가 된다.
package main
import (
"fmt"
)
func main() {
result, err := test(42)
if err != nil {
fmt.Println("error", err)
}
fmt.Println("result", result)
}
func test(arg int) (int, error) {
if arg == 42 {
var str *string
if *str == "test" {
// ...
}
return arg + 4, nil
}
return arg + 3, nil
}
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x480f16]
goroutine 1 [running]:
main.test(...)
/mnt/c/Users/kim/Desktop/test/main.go:19
main.main()
/mnt/c/Users/kim/Desktop/test/main.go:8 +0x16
exit status 2
런타임이 종료가 되면 안되는 경우 recover
를 사용하여 방지 할 수 있고
에러 스택도 추적하고 싶으면 debug.Stack()
을 사용하면 된다.
package main
import (
"fmt"
"runtime/debug"
)
func main() {
defer func() {
if err := recover(); err != nil {
fmt.Println(fmt.Sprintf("Recovered. Error: %v \n %v", err, string(debug.Stack())))
// panic 복구
// ...
}
}()
result, err := test(42)
if err != nil {
fmt.Println("error", err)
} else {
fmt.Println("result", result)
}
}
func test(arg int) (int, error) {
if arg == 42 {
var str *string
if *str == "test" {
// ...
}
return arg + 4, nil
}
return arg + 3, nil
}
Recovered. Error: runtime error: invalid memory address or nil pointer dereference
goroutine 1 [running]:
runtime/debug.Stack()
/usr/local/go/src/runtime/debug/stack.go:24 +0x65
main.main.func1()
/mnt/c/Users/kim/Desktop/test/main.go:11 +0x3d
panic({0x48cb20, 0x523fc0})
/usr/local/go/src/runtime/panic.go:884 +0x212
main.test(...)
/mnt/c/Users/kim/Desktop/test/main.go:26
main.main()
/mnt/c/Users/kim/Desktop/test/main.go:16 +0x3c
웹 서버와 같이 런타임에 에러가 발생해도 종료가 되지 않고
에러 메시지를 추적할 수 있는 방법을 알아 보았다.