이번 편의 목표: 잘못된 일수 입력을 패닉 대신 error로 돌려 호출자가 처리하게 합니다.

실패할 수 있는 함수는 결과와 error를 함께 돌려줍니다. 성공하면 error는 nil입니다. 호출자는 err를 확인한 뒤에 결과를 씁니다. 프로그램의 가정 자체가 깨진 버그에만 panic을 둡니다.

Go
package main

import (
	"fmt"
	"strconv"
)

func parseDays(text string) (int, error) {
	days, err := strconv.Atoi(text)
	if err != nil {
		return 0, fmt.Errorf("숫자가 아닙니다")
	}
	if days < 0 {
		return 0, fmt.Errorf("음수는 일수가 아닙니다")
	}
	return days, nil
}

func main() {
	days, err := parseDays("3")
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(days * 100)
}

3은 정수로 바뀌고 0 이상이므로 오류는 nil입니다. 출력은 300입니다. Atoi가 실패하면 숫자가 아닙니다. 를 돌려줍니다. 변환에 성공해도 음수이면 음수는 일수가 아닙니다. 를 돌려줍니다.

오류가 있는데 결과 정수를 그대로 쓰면 0이 정상 일수처럼 보입니다. if err != nil을 먼저 두는 이유가 그것입니다.

직접 해 보기

parseDays("-1")로 바꿔 음수는 일수가 아닙니다. 가 출력되는지 확인하세요.

해설

-1은 정수 변환에는 성공합니다. 그 다음 조건이 음수를 error로 돌리므로, main은 금액 대신 오류 문구를 출력합니다.