Swift-18: 오류 처리(Error handling)

3678 단어
오류 처리(Error handling)는 오류에 응답하고 오류를 복구하는 프로세스입니다.

1 오류 표시 및 던지기

Error 빈 프로토콜은 이 유형이 오류 처리에 사용할 수 있음을 나타낸다
enum VendingMachineError: Error {
    case InvalidSelection //     
    case InsufficientFunds(coinsNeeded: Int) //    
    case OutOfStock //  
}
throw VendingMachineError.InsufficientFunds(coinsNeeded: 5)

2 오류 처리


코드에서 오류가 발생할 수 있는 부분을 표시하기 위해 오류가 발생할 수 있는 함수, 방법, 구조기를 호출하기 전에try 키워드나 try를 추가하시겠습니까?또는try!이런 변체.
오류를 처리하는 네 가지 방법:
  • throwing 함수로 오류 전달
  • throwing 함수: 함수 성명된 매개 변수 목록 다음에throws 키워드를 추가하여 함수, 방법, 구조기가 오류를 던질 수 있음을 나타냅니다.
        func canThrowErrors() throws -> String
        func cannotThrowErrors() -> String
    

    throwing 함수는 내부에서 오류를 던져서 함수가 호출될 때의 역할 영역에 오류를 전달할 수 있습니다.throwing 함수만 오류를 전달할 수 있습니다.어떤 비throwing 함수 내부에서 던져진 오류는 함수 내부에서만 처리할 수 있습니다.
    struct Item {
        var price: Int
        var count: Int
    }
    class VendingMachine {
        var inventory = [
            "Candy Bar": Item(price: 12, count: 7),
            "Chips": Item(price: 10, count: 4),
            "Pretzels": Item(price: 7, count: 11)
        ]
        var coinsDeposited = 0
        func dispenseSnack(snack: String) {
            print("Dispensing \(snack)")
        }
        func vend(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
            dispenseSnack(snack: name)
        }
    }
    let favoriteSnacks = [
        "Alice": "Chips",
        "Bob": "Licorice",
        "Eve": "Pretzels",
    ]
    func buyFavoriteSnack(person: String, vendingMachine: VendingMachine) throws {
        let snackName = favoriteSnacks[person] ?? "Candy Bar"
        try vendingMachine.vend(itemNamed: snackName)
    }
    //  throwing     throwing        。
    struct PurchasedSnack {
        let name: String
        init(name: String, vendingMachine: VendingMachine) throws {
            try vendingMachine.vend(itemNamed: name)
            self.name = name
        }
    }
    
  • Do-catch로 오류 처리
  • var vendingMachine = VendingMachine()
    vendingMachine.coinsDeposited = 8
    do {
        try buyFavoriteSnack(person: "Alice", vendingMachine: vendingMachine)
    } catch VendingMachineError.InvalidSelection {
        print("Invalid Selection.")
    } catch VendingMachineError.OutOfStock {
        print("Out of Stock.")
    } catch VendingMachineError.InsufficientFunds(let coinsNeeded) {
        print("Insufficient funds. Please insert an additional \(coinsNeeded) coins.")
    }
    //    “Insufficient funds. Please insert an additional 2 coins.”
    
  • 오류를 옵션 값으로 변환
  • someThrowingFunction () 에서 오류가 발생하면 x와 y의 값이 nil이고, 그렇지 않으면 x와 y의 값이 이 함수의 되돌아오는 값입니다.someThrowingFunction () 의 반환값 형식이 어떤 종류든지 간에 x와 y는 이 종류의 선택할 수 있는 형식입니다.x, y의 두 가지 형식은 유사하다,try?더 깔끔하게.
    func someThrowingFunction() throws -> Int {
        // ...
        return 0
    }
    let x = try? someThrowingFunction()
    let y: Int?
    do {
        y = try someThrowingFunction()
    } catch {
        y = nil
    }
    
  • 오류 전송 해제
  • try! 오류 전달을 금지하고 오류가 발생하면 실행 오류가 발생합니다.let photo = try! loadImage("./Resources/John Appleseed.jpg")

    3 정리 작업 지정


    playground 파일이 andyRon/LearnSwift에 있음

    좋은 웹페이지 즐겨찾기