Study Memory Work
[Go Lang] 에러처리 본문
Document
예제로 배우는 Go 프로그래밍 - Go 에러처리
1. Go 에러 Go는 내장 타입으로 error 라는 interface 타입을 갖는다. Go 에러는 이 error 인터페이스를 통해서 주고 받게 되는데, 이 interface는 다음과 같은 하나의 메서드를 갖는다. 개발자는 이 인터페
golang.site
기본 에러처리
fmt.Errorf 를 return. 잘 쓰지 않는 방법..!
func notZero(n int) (string, error) {
if n != 0 {
s := fmt.Sprint("Hello Golang : ", n)
return s, nil
}
return "", fmt.Errorf("%d를 입력했습니다. 에러 발생!", n)
}
func main() {
// error func를 이용한 예외처리
a, err := notZero(1)
if err != nil {
log.Fatal(err)
}
fmt.Println("ex 1 : ", a)
b, err := notZero(0)
if err != nil {
log.Fatal(err)
}
// Fatal 이후 프로그램 종료 후 실행
fmt.Println("a, b > ", a, b)
}
사용자 에러처리
errors.New 를 return
package main
import (
"errors"
"fmt"
"math"
)
func Power(f float64, i float64) (float64, error) {
if f == 0 {
return 0, errors.New("0은 사용 불가능 합니다.")
}
return math.Pow(f, i), nil
}
func main() {
// Go error 패키지 New 메소드 사용 > 사용자 에러 처리 생성
a := []float64{4, 10}
for _, i := range a {
fmt.Println()
if f, err := Power(i-4, i); err != nil {
fmt.Printf("Error Message : %s\n", err)
} else {
fmt.Println("ex1 : ", f)
}
}
}
Error 구조체와 메소드를 활용한 에러처리
error를 위한 구조체와 메소드를 만들고
사용자 에러처리 시, 구조체에 데이터를 담에 return
package main
import (
"fmt"
"log"
"math"
"time"
)
// 예외처리 구조체
type PowError struct {
time time.Time // error 발생시간 체크
value float64
message string
}
// 예외처리 메소드
func (e PowError) Error() string {
return fmt.Sprintf("[%v]Error - Input Value(value: %g) - %s", e.time, e.value, e.message)
}
func Power(f, i float64) (float64, error) {
if f == 0 { // 예외시 위에 만들어놓은 구조체에 데이터를 담에 return
return 0, PowError{time: time.Now(), value: f, message: "0은 사용할 수 없습니다."}
}
if math.IsNaN(f) || math.IsNaN(i) { // 예외시 위에 만들어놓은 구조체에 데이터를 담에 return
return 0, PowError{time: time.Now(), value: f, message: "숫자가 아닙니다."}
}
return math.Pow(f, i), nil
}
func main() {
a := []float64{10, 4}
for _, i := range a {
fmt.Println()
if f, err := Power(i-4, i); err != nil {
log.Fatal(err)
} else {
fmt.Println("ex1 : ", f)
}
}
}
출력:
> ex1 : 6.0466176e+07 > [2023-02-27 14:57:03.394628 +0900 KST m=+0.000078251]Error - Input Value(value: 0) - 0은 사용할 수 없습니다. |
Panic과 Recover
- Panic
- 호출 즉시, 해당 메소드를 즉시 중지시키고 defer 함수를 호출하고(있으면) 자기자신을 호출한 곳으로 리턴된다.
- 런타임 이외에 사용자가 코드 흐름에 따라 에러를 발생시킬 때 중요하다.
- 문법적인 에러는 아니지만 논리적인 코드 흐름에 따른 에러 발생 처리가 가능하다.
...
func main() {
// Go panic 함수.
// 사용자가 에러 발생이 가능하다
// Panic : 호출 즉시, 해당 메소드를 즉시 중지시키고 defer 함수를 호출하고(있으면) 자기자신을 호출한 곳으로 리턴된다.
// 런타임 이외에 사용자가 코드 흐름에 따라 에러를 발생시킬 때 중요하다.
// 문법적인 에러는 아니지만 논리적인 코드 흐름에 따른 에러 발생 처리가 가능하다.
fmt.Println("Start Main")
panic("Error occurred : user stopped!") // 방법1
//log.Panic("Error occurred : user stopped!") // 방법2
fmt.Print("End Main")
}
- Recover
- 에러 복수 함수
- Panic으로 발생한 에러를 복수 후 코드 재 샐행한다.
- 즉, 코드 흐름을 정상 상태로 복구하는 기능
- Panic message를 받을 수 있다.
...
func runFunc() {
defer func() {
s := recover() // panic message를 받을 수 있다.
fmt.Println("Error Message : ", s)
}()
panic("Error occurred!!!!! recover가 받아가는 msg")
fmt.Println("호출 안되는 부분!!")
}
func main() {
fmt.Println("Start Main")
runFunc()
fmt.Print("End Main") // recover로 panic을 처리해주었기 때문에 정상 실행
}
출력:
> Start Main > Error Message : Error occurred!!!!! recover가 받아가 > End Main |
'Programing > Go' 카테고리의 다른 글
[Go Lang] File IO : 파일 읽기 (0) | 2023.02.28 |
---|---|
[Go Lang] File IO : 파일 쓰기 (0) | 2023.02.27 |
[Go Land] Time (0) | 2023.02.23 |
[Go Lang] String Formatting (0) | 2023.02.23 |
[Go Lang] String Function (0) | 2023.02.23 |