Recent Comments
Link
Recent Posts
Today
Total
«   2025/03   »
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
관리 메뉴

Study Memory Work

[Go Lang] 에러처리 본문

Programing/Go

[Go Lang] 에러처리

Hera Choi 2023. 2. 27. 15:13

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