Error Handling (do - try - catch) (feat. LocalizedError)

hoBahk·2021년 11월 25일
0

Error Handling

목록 보기
1/1

안녕하세요 오늘은 Enum을 활용한 에러처리에 대해 간단하게 보도록 하겠습니다.

에러처리는 프로그램이 우리가 예상하는 대로 작동된다는 확신이 없기 때문에 발생할 오류를 예상하여 오류가 발생했을 때 적절한 작업을 해주기 위한것입니다.

먼저, 오류는 어떻게 던질까요?
오류는 throws를 통해 던지게 됩니다.

func buy(product: String) throws {
    guard money > 1000  else {
        throw VendingMachine.noMoney
    }
    guard stock > 0 else {
        throw VendingMachine.soldOut
    }
    print("\(product) 나왔습니다.")
}

위의 예제를 보시면 buy()함수에서 잔액이 1000보다 크지 않거나 재고가 0보다 크지 않으면 오류를 발생시키고 던집니다.

그러면 오류를 받는 곳에서는 처리를 해주어야 합니다.
오류를 처리하는데 많이 사용되는 것은 do-try-catch 입니다.
do-try-catch는 아래의 형태입니다.

    do {
        try expression
        statements
    } catch pattern 1 {
        
    } catch pattern 2 {
    
    } catch {
    
    }

do 절에서 try를 통해 오류를 던지면 catch 절에서 오류를 받아 오류에 따라 처리하는 방식입니다.

예제를 보시면,
do절에서 buy()함수 앞에 try를 적어주어 함수에서 발생한 오류를 시도하게 됩니다. 그래서 오류가 발생한다면 catch절에서 오류를 처리해줍니다.

do {
    try buy(product: "음료수")
} catch VendingMachine.noMoney {
    print("잔액부족입니다.")
} catch VendingMachine.soldOut {
    print("품절입니다.")
}

그러면 VendingMachine.noMoney, VendingMachine.soldOut는 무엇일까요?
이것은 제가 열거형을 통해 정의해준 오류의 종류입니다.

오류는 열거형과 친구입니다. 오류를 정의할 때 열거형을 사용하면 좋습니다.

enum VendingMachine: Error {
    case noMoney
    case soldOut
    
    
    var errorDescription: String {
        switch self {
        case .noMoney:
            return "잔액부족입니다."
        case .soldOut:
            return "품절입니다."
        }
    }
}

또한 열거형와 switch 또한 친구이죠. 이 세가지를 조합하여 오류를 정의해주었습니다.
열거형의 케이스로 에러를 정의해주고, errorDescription을 연산 프로퍼티로 선언하여 안에 swich문을 통해 각 오류에 대한 적절한 행동을 취해줄 수 있습니다.
지금은 간단하게 문자열만 리턴해주고 있지만 필요할 땐 적절하게 메서드를 호출해 추가적인 정보를 제공할 수도 있습니다.
오류 메시지를 관리하는 방법에 대해서는 다음에 한번 더 다루도록 하겠습니다.

오류메시지를 관리해줄 때 사용하는 것이 LocalizedError프로토콜을 사용하여 하는 방법도 있는데 저는 아직 LocalizedError프로토콜을 사용하여 얻을 수 있는 이점을 모르겠어서 사용하지 않았습니다.
LocalizedError프로토콜을 사용하면 얻을 수 있는 이점을 아시는 분은 댓글로 남겨주시면 감사하겠습니다.🙏

profile
호박에 줄 그어서 수박 되는 성장 드라마

0개의 댓글