🔥 오류 표현과 오류 던지기

366자
5분

Swift에서 오류는 Error 프로토콜을 따르는 타입의 값으로 표현됩니다. 이 빈 프로토콜은 해당 타입이 오류 처리에 사용될 수 있음을 나타내죠.

Swift의 열거형(enumeration)은 관련된 오류 조건들을 모델링하는데 특히 적합합니다. 열거형의 연관 값(associated value)을 통해 오류의 성격에 대한 추가 정보를 전달할 수 있기 때문이에요. 예를 들어, 게임 내의 자판기를 작동시킬 때 발생할 수 있는 오류 조건들을 다음과 같이 표현할 수 있습니다:

enum VendingMachineError: Error {
    case invalidSelection // 유효하지 않은 선택
    case insufficientFunds(coinsNeeded: Int) // 자금 부족 (필요한 동전 개수)
    case outOfStock // 재고 소진
}
swift

이 코드에서는 VendingMachineError라는 열거형을 정의하고 있어요. 이 열거형은 Error 프로토콜을 따르므로 오류 처리에 사용될 수 있습니다. 그리고 세 가지 오류 케이스를 정의하고 있죠:

  1. invalidSelection: 사용자가 유효하지 않은 선택을 했을 때 발생하는 오류입니다.
  2. insufficientFunds: 사용자의 자금이 부족할 때 발생하는 오류로, 연관 값으로 필요한 동전의 개수를 전달합니다.
  3. outOfStock: 선택한 항목의 재고가 소진되었을 때 발생하는 오류입니다.

오류를 던진다는 것은 예기치 않은 일이 발생해서 정상적인 실행 흐름을 계속 진행할 수 없음을 나타내는 것입니다. 오류를 던질 때는 throw 문을 사용해요. 예를 들어, 다음 코드는 자판기에 5개의 추가 동전이 필요함을 나타내기 위해 오류를 던집니다:

throw VendingMachineError.insufficientFunds(coinsNeeded: 5)
swift

이렇게 오류를 던지면, 현재 함수나 메서드의 실행은 즉시 중단되고 오류를 처리할 수 있는 코드로 제어가 전달됩니다.

오류를 던질 수 있는 함수나 메서드는 throws 키워드로 선언되어야 해요. 예를 들어 볼까요?

func buySnack(itemNamed name: String) throws {
    guard let item = inventory[name] else {
        throw VendingMachineError.invalidSelection
    }
 
    guard item.count > 0 else {
        throw VendingMachineError.outOfStock
    }
 
    guard item.price <= coinsDeposited else {
        throw VendingMachineError.insufficientFunds(coinsNeeded: item.price - coinsDeposited)
    }
 
    coinsDeposited -= item.price
 
    var newItem = item
    newItem.count -= 1
    inventory[name] = newItem
 
    print("Dispensing \(name)")
}
swift

buySnack(itemNamed:) 함수는 throws 키워드로 선언되었기 때문에 함수 내에서 오류를 던질 수 있습니다.

함수는 먼저 요청된 항목이 인벤토리에 있는지 확인하고, 없으면 invalidSelection 오류를 던지죠. 그 다음엔 해당 항목의 재고가 있는지 확인하고, 없으면 outOfStock 오류를 던집니다. 마지막으로는 투입된 동전이 가격보다 많은지 확인하고, 부족하면 insufficientFunds 오류를 던지면서 필요한 추가 동전 개수를 연관 값으로 전달합니다.

모든 조건이 만족되면 함수는 투입된 동전에서 가격을 차감하고, 인벤토리에서 해당 항목의 개수를 하나 줄인 후, 항목을 배출하는 메시지를 출력합니다.

이렇게 오류를 표현하고 던지는 방법을 알아보았어요. 오류를 던질 수 있게 함수를 선언하고, 필요한 경우 throw를 사용해 적절한 오류를 던지는 거죠. 다음 섹션에서는 던져진 오류를 어떻게 처리하는지 살펴보도록 하겠습니다!