func canThrowAnError() throws {
// 이 함수는 오류를 발생시키거나 발생시키지 않을 수 있다.
}
throws가 던지고 try가 받고
do {
try canThrowAnError()
// no error was thrown
} catch {
// an error was thrown
}
결론!
옵셔널은 한가지의 경우에 대해서만 처리를 하지만 에러처리는 여러 경우의 수와 그에 따른 에러를 처리할 수 있다!
// 게임 내에서 자동 판매기를 작동하는 에러 조건을 나타내는 방법
enum VendingMachineError: Error {
case invalidSelection
case insufficientFunds(coinsNeeded: Int)
case outOfStock
}
throw VendingMachineError.insufficientFunds(coinsNeeded: 5)
// 자동 판매기에 5개의 코인이 더 필요하다고 에러를 발생 시킴
// 에러가 발생하면 정상적인 흐름을 계속할 수 없음을 나타낸다 "이런 오류 났어!"
에러를 처리하는 4가지 방법
1. 함수에서 해당 함수를 호출하는 코드로 에러를 전파하는 방법
2. do-catch 구문을 사용하는 방법
3. 옵셔널 값으로 에러를 처리하는 방법
4. 에러가 발생하지 않을 것이라고 주장하는 방법
- Swift에서 에러 처리는 프로세스 인 호출 스택 해제가 포함되지 않는다.
- throw 구문의 성능 특성은 return 구문의 성능 특성과 비슷
func canThrowErrors() throws -> String
주의!
throws 함수는 에러를 전파만 할 수 있기 때문에 throws 선언이 되지 않은 함수 내에서 발생된 모든 에러는 함수 내에서 처리되어야 함!
do {
try expression
statments
} catch pattern 1 {
statments
} catch pattern 2 {
statements
} catch {
statements
}
func someThrowingFunction() throws -> Int {
// ...
}
let x = try? someThrowingFunction()
// x = nil
지연된 구문은 break 또는 return 구문과 같이 구문의 밖으로 제어를 이동하거나 에러를 발생시키는 코드를 포함할 수 없음
func testDefer() {
print("1")
defer { print("defer 1") }
print("2")
}
// 1 - 2 - defer 1
func testDefer() {
defer { print(“1”) }
defer { print(“2”) }
defer { print(“3”) }
}
// 3 - 2 - 1