에러 패키지는 다음과 같이 인터페이스로 정의되어 있으므로 나만의 에러 구조체를 정의할 수 있다.
type error interface {
Error() string
}
다음과 같이 사용할 수 있을 것이다.
...
type PasswordError struct {
Len int
RequireLen int
}
func (pw PasswordError) Error () {
return "암호 길이가 짧습니다"
}
func RegisterAccount(name, password string) error {
if len(password) < 8 {
return PasswordError{len(password), 8}
}
return nil
}
func main(){
err := RegisterAccount("myID", "myPW")
if err != nil {
if errInfo, ok := err.(PasswordError); ok { //타입 어서션.
fmt.Printf("%v Ln:%d RequireLen:%d", errInfo, errInfo.Len, errInfo.RequireLen)
}
}else{
fmt.Println("회원가입 성공")
}
}
프로그램을 강제 종료시켜 문제 발생 원인을 바로 파악하게 하는 것이 목적이다.
이런 점에서 에러와 다르다.
실제 배포 환경에서는 패닉 발생 시 리커버리하도록 할 것
panic(interface{})
어떤 타입이든 넣어서 사용할 수 있다.