swift

swift - Error Handing #1 (Error Handing)

행복하게사는게꿈 2021. 1. 13. 10:34

Error Handing

에러가 발생하면 프로그램이 강제 종료되지만 에러를 직접 Handing하면 프로그램 종료 없이 처리 할 수 있다.

 

에러는 크게 Comile Time Error와 Runtime Error로 구분한다.

 

Compile error는 보통 문법과 관련이 있다.

 

runtime error는 프로그램이 실행중일때 발생, 문법적인 에러가 아니더라도 디바이스의 상태나 리소스 때문일 수도 있다.

 


// err 프로토콜을 채용하면 err 형식이 되는데 보통 enum으로 선언한다.
enum DataParsingError : Error {
    case invalidType
    case InvalidField
    case missingRequiredField(String)
}

// 일반 형식과 에러 형식의 차이점은 하나이다.
// 에러 형식은 swift 에러 처리 시스템에 통합된다.
// 이제 데이터 파싱에서 에러가 발생하면 새로운 에러 인스턴스를 생성하고 에러를 처리하는 코드로 전달 할 수 있다.
// 에러는 전달받는 코드에서는 발생한 에러종류를 확인하고 에러를 처리한다.
// 에러를 전달하는 것을 에러를 던진다는 것으로 표현한다. -> throw 키워드

// throw 뒤에는 err형식의 인스턴스가 위치한다.
// throw문은 아무데서나 호출할 수 없고 코드 블록이 에러를 던질 수 있다고 선언되어 있어야 한다.

// throwing func
func parsing(data: [String: Any]) throws {
    guard let _ = data["name"] else {
        throw DataParsingError.missingRequiredField("name")
    }
    
    guard let _ = data["age"] as? Int else {
        throw DataParsingError.invalidType
    }
}

// throw func을 호출할때는 try 문을 사용한다.
// try : do문과 같이 쓴다
// try? : err가 발생할 경우 nil
// try! : err가 발생할경우 runtime err

try? parsing(data: [:])

// 에러를 처리하는 방법
// 1. do-catch statement
// 2. try Expression + Optional Binding
// 3. hand over : 전달받은 에러를 다른 코드 블록으로 다시 전달