하루에 0.01%라도 성장하자

Develop/iOS

Swift 오류 처리 ( Error )

뚠님 2019. 5. 13. 17:36
반응형

Swift

 

오류 처리

 

  • 스위프트에서는 주로 Error 프로토콜을 이용한다.
  • 열거형이다.
  • 연관 값을 통해 오류에 관한 부가 정보를 제공

 

오류(Error) 예시

 

enum ExceptionError : Error{
    case invalidInput;
    case outOfStore;
}

 

throws

 

  • 오류가 발생할 여지가 있는 함수임을 표현
class VendingMachine {
    let itemPrice : Int = 100;
    var itemCount : Int = 5;
    var deposited : Int = 0;
    
    
    func receiveMoney( money:Int) throws{
    	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 <= deposited else {
            let moneyNeeded: Int
            moneyNeeded = numberOfItemsToVend * itemPrice - deposited
            
            throw VendingMachineError.insufficientFunds(moneyNeeded: moneyNeeded)
        }
        
        // 오류가 없으면 정상처리
        let totalPrice = numberOfItemsToVend * itemPrice
        
        self.deposited -= totalPrice
        self.itemCount -= numberOfItemsToVend
        
        return "\(numberOfItemsToVend) 제공"
    }
}    

 

 

do-catch

 

자바의 try-catch 와 같다.

 

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


// 응용 1

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

// 응용 2
// 딱히 케이스별로 오류처리 할 필요가 없으면 catch를 간략화 한다.
do {
    result = try machine.vend(numberOfItems: 4)
} catch {
    print(error)
}


// 응용 3
// 케이스별로 오류처리할 필요가 없을 때
do {
    result = try machine.vend(numberOfItems: 4)
}



 

try? try!

 

  1. try?
    • 별도의 오류처리를 통보 받지 않고 nil로 받음.
    • 정상 동작하면 정상적인 값으로 받음.
result = try? machine.vend(numberOfItems: 2)
result // Optional("2개 제공함")

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

 

  1. try!
    • 오류가 발생하지 않을 것이라는 확신이 있어야 함!
    • 에러가 발생하면 런타임 에러 발생
result = try! machine.vend(numberOfItems: 1)
result // 1개 제공함

 

 

반응형

'Develop > iOS' 카테고리의 다른 글

iOS 음악 재생 앱 만들기 Part#2 - Audio Method  (0) 2019.05.14
iOS 음악 재생 앱 만들기 Part#1 - 앱 개발  (0) 2019.05.14
Swift 익스텐션  (0) 2019.05.13
Swift 프로토콜 (Protocol)  (0) 2019.05.10
Swift assert 와 guard  (0) 2019.05.10