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를 제어, 처리하는 과정이다.
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)
error를 다룸으로써 문제를 해결하거나, 대안을 시도하거나 또는 user에게 실패를 알려줄 필요가 있다.
Swift에는 error를 다루는 4가지 방법이 있다.
throws
)try
)try?
)try!
)발생할 수 있는 error를 throws
하고, try
, try?
or try!
키워드를 사용해서 프로그램의 흐름을 적절하게 바꿀 수 있어야 한다.
error를 던질 수 있는 function, method, or initializer의 경우 throws
키워드를 parameters 뒤에 작성한다.
func canThrowErrors() throws -> String
func cannotThrowErrors() -> String
throwing function은 function을 호출한 곳에서 error를 처리해줘야 한다.
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 구문의 남은 구문이 실행된다.
try?
를 사용해서 optional value로 바꾸어 error를 처리할 수도 있다.
func someThrowingFunction() throws -> Int {
// ...
}
let x = try? someThrowingFunction()
let y: Int?
do {
y = try someThrowingFunction()
} catch {
y = nil
}
error가 발생하지 않을 것을 확신하는 경우에 try!
표현을 사용할 수 있다. 예를 들어 다음 코드는 애플리케이션에 포함된 이미지를 불러오는 것으로, 런타임에 에러가 발생하지 않을 것을 확신할 수 있어 try!
를 사용하기 적절하다.
let photo = try! loadImage(atPath: "./Resources/John Appleseed.jpg")
https://docs.swift.org/swift-book/LanguageGuide/ErrorHandling.html
https://docs.swift.org/swift-book/LanguageGuide/MemorySafety.html