[Swift] Error Handling

Lena·2020년 12월 21일
0
post-custom-banner

Error Handling

Error handling is the process of responding to and recovering from error conditions in your program. Swift provides first-class support for throwing, catching, propagating, and manipulating recoverable errors at runtime.

Error Handling은 프로그램에서 발생할 수 있는 error를 제어, 처리하는 과정이다.

Representing and Throwing Errors

In Swift, errors are represented by values of types that conform to the Error protocol. This empty protocol indicates that a type can be used for error handling.

Swift에서 error는 Error protocol을 준수한 type의 값으로 표현되는데, 이 empty protocol은 protocol을 따르는 type이 error 처리에 사용될 것을 가리킨다.

열거형이 연관된 error를 모델링하기에 적합하다.

enum VendingMachineError: Error { // conform Error protocol
     case invalidSelection
     case insufficientFunds(coinsNeeded: Int)
     case outOfStock
}

// throw error
throw VendingMachineError.insufficientFunds(coinsNeeded: 5)

Handling Errors

error를 다룸으로써 문제를 해결하거나, 대안을 시도하거나 또는 user에게 실패를 알려줄 필요가 있다.

Swift에는 error를 다루는 4가지 방법이 있다.

  • propagate the error (throws)
  • handle the error using a do-catch statement (try)
  • handle the error as an optional value (try?)
  • assert that the error will not occur (try!)

발생할 수 있는 error를 throws 하고, try, try? or try! 키워드를 사용해서 프로그램의 흐름을 적절하게 바꿀 수 있어야 한다.

Propagating Errors Using Throwing Functions

error를 던질 수 있는 function, method, or initializer의 경우 throws 키워드를 parameters 뒤에 작성한다.

func canThrowErrors() throws -> String

func cannotThrowErrors() -> String

throwing function은 function을 호출한 곳에서 error를 처리해줘야 한다.

Handling Errors Using Do-Catch

do-catch문을 사용해서 error를 핸들링할 수 있다.

do {
    try expression
    statements // If no error is thrown
} catch pattern 1 {
    statements
} catch pattern 2 where condition {
    statements
} catch pattern 3, pattern 4 where condition {
    statements
} catch {
    statements // If no pattern is matched
}

위 예제는 try 표현으로 function을 호출한다. function이 error를 throw할 수 있는 함수이므로 error가 발생하면 즉시 catch 절로 빠져야 한다. error는 do-catch pattern에 따라 처리되고 어떠한 pattern과도 매치되지 않으면 마지막 catch 절로 빠지게 된다. 만약 error가 발생하지 않았다면 do 구문의 남은 구문이 실행된다.

Converting Errors to Optional Values

try?를 사용해서 optional value로 바꾸어 error를 처리할 수도 있다.

func someThrowingFunction() throws -> Int {
    // ...
}

let x = try? someThrowingFunction()

let y: Int?
do {
    y = try someThrowingFunction()
} catch {
    y = nil
}

Disabling Error Propagation

error가 발생하지 않을 것을 확신하는 경우에 try! 표현을 사용할 수 있다. 예를 들어 다음 코드는 애플리케이션에 포함된 이미지를 불러오는 것으로, 런타임에 에러가 발생하지 않을 것을 확신할 수 있어 try!를 사용하기 적절하다.

let photo = try! loadImage(atPath: "./Resources/John Appleseed.jpg")

References

https://docs.swift.org/swift-book/LanguageGuide/ErrorHandling.html
https://docs.swift.org/swift-book/LanguageGuide/MemorySafety.html

post-custom-banner

0개의 댓글