error
interface & errors
packagepackage main
import "fmt"
func main() {
input := 0
count, err = fmt.Scanln(&input)
1
if err != nil {
return
}
...
}
// builtin.go
// The error built-in interface type is the conventional interface for
// representing an error condition, with the nil value representing no error.
type error interface {
Error() string
}
fmt.Scanln
반환하는 에러 객체는 error 인터페이스이다
.
Go는 error 인터페이스 구현체를 제공하는데, 이것이 erros 패키지의 errorString
이다.
// because the former will succeed if err wraps an *fs.PathError.
package errors
// New returns an error that formats as the given text.
// Each call to New returns a distinct error value even if the text is identical.
func New(text string) error {
return &errorString{text}
}
// errorString is a trivial implementation of error.
type errorString struct {
s string
}
func (e *errorString) Error() string {
return e.s
}
그래서 다음의 방법으로 에러를 반환할 수 있다.
package main
import (
"fmt"
"errors"
)
func main() {
var a, b int
nm err := fmt.Scanln(&a, &b)
if err != nil {
panic(err)
}
result, err2 := getResult(a, b)
if err2 != nil {
panic(err2)
}
}
func getResult(a int, b int) (int, error) {
if a == 0 {
return -1, errors.New("a should not be zero")
}
return a + b
}
log
package위 코드처럼 panic
을 사용하면 프로그램이 종료된다.
의도에 따라 틀린 방법은 아닌데, 보통은 예외처리를 위해 log
패키지 기능을 사용한다.
package mina
import "log"
func main() {
log.Print(err) // log.Println(err)
log.Fatal(err)
log.Panic(err)
}
크게 3가지 종류의 함수를 제공한다.
시간, 에러 정보를 출력하고 계속 프로그램이 진행된다.
시간, 에러 정보를 출력하고 정상적으로 프로그램이 종료된다.
시간, 에러 정보를 출력하고 Panic을 발생시킨다. defer
구문이 없다면 런타임 패닉이 발생하고 비정상적으로 프로그램이 종료된다.
즉, Panic()
을 호출한 것과 동일하다.
package main
import (
"errors"
"fmt"
"log"
)
func main() {
var input1, input2 int
_, err1 := fmt.Scanln(&input1, &input2)
if err1 != nil {
log.Fatal(err1) // 에러가 있으면 그냥 종료
}
defer panicHandler()
result, err2 := getResult(input1, input2)
if err2 != nil {
log.Panic(err2) // 에러가 있으면 Panic호출
}
fmt.Println("result is : ", result)
}
func getResult(input1 int, input2 int) (int, error) {
if input1 == 0 {
return -1, errors.New("input1 should not be zero")
}
return input1 + input2, nil
}
func panicHandler() {
fmt.Println("handle panic situation")
}
실행 결과는 다음과 같다.
// log.Panic(err2)으로 출력된 에러 메시지
2023/04/22 14:56:21 input1 should not be zero
// defer 구문을 사용해서 main 메서드 종료 전에 호출된 panicHanlder
handle panic situation
// panic을 호출했으므로 에러 메시지가 출력되고 비정상 종료
panic: input1 should not be zero