Swift 지식 포인트 17 - 오류 처리

2187 단어
오류는 Error 프로토콜을 준수하는 유형으로 표시됩니다.Swift의 매거 유형은 관련 오류 상태를 구축하는 데 특히 적합하며, 매거의 관련 값은 오류 상태에 대한 추가 정보를 제공할 수 있습니다.예를 들어 한 게임에서 자판기를 조작할 때 발생할 수 있는 오류 상태를 이렇게 표시할 수 있다.
enum VendingMachineError: Error {
    case invalidSelection
    case insufficientFunds(coinsNeeded: Int)
    case outOfStock
}

오류를 던져서throw 키워드를 사용합니다.
4가지 처리 방법:
  • 함수가 던진 오류를 이 함수를 호출하는 코드에 전달합니다
  • Do-catch 문장으로 오류를 처리합니다
  • 오류를 선택 사항으로 처리합니다
  • 이 오류는 근본적으로 발생하지 않을 것이라고 단언한다

  • throwing 함수 전달 오류
    함수, 방법, 구조기가 오류를 던질 수 있음을 표시하기 위해 함수 성명의 매개 변수 목록에throws 키워드를 추가합니다.
    func canThrowErrors() throws -> String
    

    throwing 함수만 오류를 전달할 수 있습니다.어떤 비throwing 함수 내부에서 던진 오류는 함수 내부에서만 처리할 수 있습니다.
    잘못된 함수, 방법, 구조기를 호출하기 전에try 키워드를 추가하거나try?아니면 try!이런 변체.
    Do-Catch 처리 오류
    do-catch 문장을 사용하여 패키지 코드를 실행하여 오류를 처리할 수 있습니다.만약 도 자구에 있는 코드가 오류를 던졌다면, 이 오류는catch 자구와 일치하여 어느 자구가 그것을 처리할 수 있는지 결정합니다.
    do {
        try expression
        statements
    } catch pattern 1 {
        statements
    } catch pattern 2 where condition {
        statements
    }
    

    오류는 주위의 작용역에 의해 처리되어야 합니다. 외곽의do-catch 오류 처리 문장이나throwing 함수의 내부입니다.
    오류를 선택적 값으로 변환
    try 사용 가능?오류를 선택 가능한 값으로 변환하여 오류를 처리합니다.try를 평가하고 있다면?표현식에서 오류가 발생했습니다. 그러면 표현식의 값은nil입니다.
    let x = try? someThrowingFunction()
    

    오류 전송 비활성화
    때때로 당신은 어떤throwing 함수가 실제로 실행될 때 오류를 던지지 않는다는 것을 알고 있습니다. 이런 상황에서 표현식 앞에서try를 쓸 수 있습니다!오류 전달을 사용하지 마십시오. 이것은 오류가 없을 때 실행될 때 호출을 단언합니다.만약 정말 오류를 던졌다면, 실행할 때의 오류를 얻을 수 있을 것이다.
    정리 작업 지정
    defer 문장을 사용하여 현재 코드 블록을 떠날 때 일련의 문장을 실행합니다.
    defer {
      //  
      //  
      //  
    }
    

    실행 지연된 문장은 브레이크,return 문장이나 오류를 던지는 제어 이동 문장을 포함할 수 없습니다.실행 지연 작업은 그들이 설명한 순서에 따라 뒤에서 실행됩니다. 즉, 첫 번째 defer 문장의 코드는 마지막에 실행되고, 두 번째 defer 문장의 코드는 두 번째 실행됩니다.마지막 문장이 첫 번째로 실행될 것이다.
    오류 처리와 관련된 코드가 없어도 defer 문장을 사용할 수 있습니다.
    func processFile(filename: String) throws {
        if exists(filename) {
            let file = open(filename)
            defer {
                close(file)
            }
            while let line = try file.readline() {
                //  。
            }
            // close(file)  , 。
        }
    }
    

    좋은 웹페이지 즐겨찾기