Swift Basic -14(오류 처리)

4573 단어
1. 오류를 표시하고 던지기
Swift에서 오류는 Error 프로토콜 유형의 값으로 표시됩니다.이 빈 프로토콜은 이 형식이 오류 처리에 사용할 수 있음을 보여 줍니다.Swift의 매거 유형은 관련 오류 상태를 구축하는 데 특히 적합하며, 매거의 관련 값은 오류 상태에 대한 추가 정보를 제공할 수 있습니다.
enum VendingMachineError : Error {
    case invalidSelection                    // 
    case insufficientFunds(coinsNeeded: Int) // 
    case outOfStock                          // 
}

2. 오류 처리
어떤 오류가 던져졌을 때, 부근의 일부 코드는 반드시 이 오류를 처리해야 한다. 예를 들어 이 문제를 바로잡거나, 다른 방식을 시도하거나, 사용자에게 오류를 보고해야 한다.Swift에는 4가지 오류 처리 방법이 있습니다.이 함수를 호출하는 코드에 함수를 던지거나do-catch 문장으로 오류를 처리하거나, 선택할 수 있는 형식으로 오류를 처리하거나, 이 오류가 발생하지 않을 것이라고 단언할 수 있습니다.
Swift의 오류 처리는 다른 언어에서try,catch,throw로 이상 처리를 하는 것과 비슷합니다.다른 언어 (Objective-C 포함) 의 이상 처리와 달리 Swift의 오류 처리는 호출 창고 해제와 관련이 없으며, 이것은 계산 대가가 높은 과정이다.따라서throw문장의 성능 특성은return문장과 필적할 수 있다.
  • throwing 함수로 오류를 전달합니다. 함수, 방법 또는 구조기가 오류를 던질 수 있음을 표시하기 위해 함수 성명의 매개 변수 목록에 throws 키워드를 추가합니다.throws 키워드가 표시된 함수를 throwing 함수라고 부른다.이 함수가 반환값 유형을 가리키면 throws 키워드는 화살표 (->) 앞에 써야 합니다.
  • func canThrowErrors() throws -> String
    func cannotThrowErrors() -> String
    

    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
          print("Dispensing \(name)")
      }
    }
    
    

    vend(itemNamed:) 방법의 실현에서guard문구를 사용하여 조기 퇴출 방법을 사용하여 어떤 물품을 구매하는 데 필요한 조건 중 어느 조건이 충족되지 않을 때 미리 퇴출 방법을 사용하고 해당하는 오류를 던질 수 있도록 합니다.throw 문장은 즉시 방법을 종료하기 때문에 물품은 모든 조건이 충족될 때만 판매됩니다.
  • Do-Catch로 오류를 처리하면 Do-catch 문장으로 패키지 코드를 실행하여 오류를 처리할 수 있습니다.만약 도 자구에 있는 코드가 오류를 던졌다면, 이 오류는catch 자구와 일치하여 어느 자구가 그것을 처리할 수 있는지 결정합니다.
  • do {
        try expression
        statements
    } catch pattern 1 {
        statements
    } catch pattern 2 where condition {
        statements
    }
    

    자세는 다음과 같습니다.
    var vendingMachine = VendingMachine()
    vendingMachine.coinsDeposited = 8
    do {
        try buyFavoriteSnack("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.”
    
    buyFavoriteSnack(person:vendingMachine:) 함수는 오류를 던질 수 있기 때문에 try 표현식에서 호출됩니다.오류가 던져지면 그에 상응하는 집행은 즉시 catch 자구로 옮겨져 이 오류가 계속 전달될지 판단한다.오류가 없으면 do 자구에 남은 문장이 실행됩니다.
  • 오류를 선택할 수 있는 값으로 변환하면try를 사용할 수 있습니까?오류를 선택 가능한 값으로 변환하여 오류를 처리합니다.try를 평가하고 있다면?표현식에서 오류가 발생했습니다. 그러면 표현식의 값은nil입니다.예를 들어 다음 코드에서 x와 y는 같은 수치와 등가의 의미를 가진다.
  • func someThrowingFunction() throws -> Int {
    }
    
    let x = try? someThrowingFunction()
    let y: Int?
    do {
        y = try someThrowingFunction()
    } catch {
        y = nil
    }
    
    someThrowingFunction() 오류가 발생하면 x와 y의 값은 nil 입니다.그렇지 않으면 x와 y의 값이 이 함수의 반환값입니다.someThrowingFunction()의 반환값 유형이 어떤 유형이든지 간에 xy 은 이 유형의 선택 가능한 유형입니다.예에서 이 함수는 정형으로 되돌아오기 때문에 x와 y는 이다.
  • defer 키워드 defer 키워드는 Ojective C에서 @try-@catch-@finally에서 @finally와 같은 역할을 처리하는 데 사용됩니다.예를 들어, 우리가 파일을 열고, 만약 오류를 내면, 우리는 항상 이 파일 핸들을 닫기를 희망한다.
  • func contents(of filePath:String) throws -> String{
        let file = open(filePath,O_RDWR)
        defer {
            close(file)
        }
        //...
    }
    

    defer에 관해서는 여러 defer가 역순으로 실행되는 것을 주의해야 한다.프로그램이 심각한 오류를 만났을 때, 예를 들어fatalError, 또는 nil, 또는segfaults를 강제로 해석할 때, defer의 코드 블록은 실행되지 않습니다.

    좋은 웹페이지 즐겨찾기