[golang] 에러(error) 예제
go언어에서 에러 발생에 대한 예제이다.
숫자 1만 받고 나머지는 에러로 표현하는 예제이다. 함수 뒤에 (..., error)로 표현한다.
fmt.Errorf를 사용한다 하더라도 실제로 Error를 출력하지 않는다. log.Fatal과 함께 표현해야 에러 로그를 출력한다.
package main
import (
"fmt"
"log"
)
func main() {
checkOnly1(1)
checkOnly1(-1)
}
func checkOnly1(n int) {
result, err := only1(n)
fmt.Println("result of only1 call :", result)
if (err != nil) {
log.Fatal(err)
}
}
func only1(number int) (bool, error) {
if number == 1 {
return true, nil
}
return false, fmt.Errorf("%d != 1", number)
}
결과는 다음과 같다.
result of only1 call : true
result of only1 call : false
2017/09/07 14:18:06 -1 != 1
exit status 1
go 언어 예제를 보면 아래처럼 많이 사용한다.
req, err := http.NewRequest("GET", "url", *tag), nil)
error 소스를 보면 다음과 같다. 어디든지 사용할 수 있는 interface이다.
type error interface {
Error() string
}
패닉(panic)을 써보자.
package main
import (
"fmt"
"log"
)
func main() {
checkOnly1(1)
checkOnly1(-1)
}
func checkOnly1(n int) {
//
//defer func() {
// r := recover()
// fmt.Println(r)
//}()
result, err := only1(n)
fmt.Println("result of only1 call :", result)
if (err != nil) {
fmt.Println("before panic")
log.Panic(err)
}
fmt.Println("after panic")
}
func only1(number int) (bool, error) {
if number == 1 {
return true, nil
}
return false, fmt.Errorf("%d != 1", number)
}
결과는 다음과 같다.
에러(패닉)이 발생하면서 exit status가 2(serious problem)를 리턴했다.
바로 종료되지 않고 main 함수 모든 내용이 실행되었다.
2017/09/07 23:56:42 -1 != 1
result of only1 call : true
after panic
result of only1 call : false
before panic
panic: -1 != 1
goroutine 1 [running]:
log.Panic(0xc42003df00, 0x1, 0x1)
/usr/local/go/src/log/log.go:322 +0xc0
main.checkOnly1(0xffffffffffffffff)
/Users/samuel.kim/go/src/google/Test.go:24 +0x29f
main.main()
/Users/samuel.kim/go/src/google/Test.go:10 +0x37
exit status 2
defer를 사용해 패닉이 발생하더라도 얌전히(?) 종료시킬 수 있다.
package main
import (
"fmt"
"log"
)
func main() {
checkOnly1(1)
checkOnly1(-1)
}
func checkOnly1(n int) {
defer func() {
r := recover()
fmt.Println(r)
}()
result, err := only1(n)
fmt.Println("result of only1 call :", result)
if (err != nil) {
fmt.Println("before panic")
log.Panic(err)
}
fmt.Println("after panic")
}
func only1(number int) (bool, error) {
if number == 1 {
return true, nil
}
return false, fmt.Errorf("%d != 1", number)
}
순서가 어그러졌지만 패닉을 잘 막았다.
result of only1 call : true
2017/09/07 23:58:29 -1 != 1
after panic
<nil>
result of only1 call : false
before panic
-1 != 1