오류 표현

- Error 프로토콜과 열거형을 통해서 오류를 표현함

 

enum 오류 종류 이름: Error {

case 종류 1

case 종류 2

case 종류 3

}

 

 

함수에서 발생한 오류 던지기

- 오류 발생의 여지가 있는 메서드는 throws를 사용하여 오류를 내포하는 함수임을 표시

 

 

오류 처리

- 오류 발생의 여지가 있는 throws 함수(메서드)는 try를 사용하여 호출해야 함

- try, try?, try!

 

try?

- 별도의 오류 처리 결과를 통보받지 않고 오류가 발생했으면 결과 값을 nil로 돌려받을 수 있음

- 정삭 동작 후에는 옵셔널 타입으로 정상 반환 값을 돌려 받음

 

try!

- 오류가 발생하지 않을 것이라는 강력한 확신을 가질 때 try! 를 사용하면 정상 동작 후에 바로 결과 값을 돌려 받음

- 오류가 발생하면 런타임 오류가 발생하여 애플리케이션 동작이 중지됨

 

do catch

- 오류 발생의 여지가 있는 throws 함수(메서드)는 do catch 구문을 활용하여 오류 발생에 대비함

 

// 자판기 동작 오류의 종류를 표현한 VendingMachineError 열거형
enum VendingMachineError: Error {
    case invalidInput // 동전을 잘못 넣은 경우
    case insufficientFunds(moneyNeeded: Int) // 돈이 모자란 경우, 얼마가 모자라는지
    case outOfStock // 물건이 없는 경우
}

// 자판기 동작 도중 발생한 오류 던지기
class VendingMachine {
    let itemPrice: Int = 100
    var itemCount: Int = 5
    var deposited: Int = 0
    
    // 돈 받기 메서드
    func receiveMoney(_ mony: Int) throws {
        
        // 입력한 돈이 0 이하면 오류를 던짐
        guard money > 0 else {
            throw VendingMachineError.invalidInput
        }
        
        // 오류가 없으면 정상처리
        self.deposited += money
        print("\(money)원 받음")
    }
    
    // 물건 팔기 메서드
    func vend(numberOfItems numberOfItemsToVend: Int) throws -> String {
        
        // 원하는 아이템의 수량이 잘못 입력되었으면 오류를 던짐
        guard numberOfItemsToVend > 0 else {
            throw VendingMachineError.invalidInput
        }
        
        // 구매하려는 수량보다 미리 넣어둔 돈이 적으면 오류를 던짐
        guard numberOfItemsToVend * itemprice <= depsited else {
            let moneyNeeded: Int
            moneyNeeded = numberOfItemsToVend * itemprice - deposited
            
            throw VendingMachineError.insufficientFunds(moneyNeeded: money)
            }
            
            // 물건이 모자란 경우
            guard itemCount >= numberOfItemsToVend else {
                throw VendingMachineError.outOfStock
            }
        // 오류가 없으면 정상처리
        let totalPrice = numberOfItemsToVend * itemprice
        
        self.deposited -= totalPrice
        self.itemCount -= numberOfItemsToVend
        
        return "\(numberOfItemsToVend)개 제공"
        }
    }
}

// 자판기 인스턴스
let machine: VendingMachine = VendingMachine()

// 판매 결과를 전달받을 변수
var result: String?

do {
    try machine.receiveMoney(0)
} catch VendingMachineError.invalidInput {
    print("입력이 잘못되었습니다")
} catch VendingMachineError.insufficientFunds(let moneyNeeded) {
    print("\(moneyNeeded)원이 부족합니다")
} catch VendingMachineError.outOfStock {
    print("수량이 부족합니다")
} // 입력이 잘못되었습니다

do {
    try machine.receiveMoney(300)
} catch {
    
    switch error {
    case VendingMachineError.invalidInput:
        print("입력이 잘못되었습니다")
    case VendingMachineError.insufficientFunds(let moneyNeeded):
        print("\(moneyNeeded)원이 부족합니다")
    case VendingMachineError.outOfStock:
        print("수량이 부족합니다")
    default:
        print("알수없는 오류 \(error)")
    } // 300원 받음

    do {
        result = try machine.vend(numberOfItems: 4)
    } catch {
        print(error)
    } // insufficientFunds(100)


    do {
        result = try machine.vend(numberOfItems: 4)
    }

// try? / try!
    result = try? machine.vend(numberOfItems: 2)
    result // optional("2개 제공함")

    result = try? machine.vend(numberOfItems: 2)
    result // nil

    result = try! machine.vend(numberOfItems: 1)
    result // 1개 제공함

    result = try! machine.vend(numberOfItems: 1)
    // 오류가 발생하면 코드가 죽음

'Swift > 문법' 카테고리의 다른 글

Tuple / Bool / Scope  (0) 2021.02.25
고차 함수(higher order function)  (0) 2021.01.30
익스텐션(extension)  (0) 2021.01.30
프로토콜(protocol)  (0) 2021.01.30
assert와 guard(assertion / early exit)  (0) 2021.01.30
Posted by khon98
,