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





'golang' 카테고리의 다른 글

[golang] 고루틴(go routine) 예제  (0) 2017.09.08
[golang] 매개 변수 받기  (0) 2017.09.08
[golang] defer 예제  (0) 2017.09.07
[golang] interface(인터페이스) 예제  (0) 2017.09.06
[golang] 함수.클로져 예제  (0) 2017.09.06
Posted by '김용환'
,