오류처리
오류처리는 프로그램이 오류를 일으켰을 때 이것을 감지하고 회복시키는 일련의 과정이다.
오류는 Error라는 프로토콜을 준수하는 타입의 값을 통해 표현된다. Error프로토콜은 사실상 요구사항이 없는 빈 프로토콜이지만, 오류를 표현하기 위한 타입(주로 열거형)은 이 프로토콜을 채택한다.
enum vendingmachineErroe: Error {
case A
case B
case C
}
오류의 종류를 미리 예상한 다음 오류때문에 다음에 행할 동작이 정상적으로 진행되지 않는다면 오류를 던져준다. (throw구문을 사용)
오류가 던져지는 것에 대비하여 던져진 오류를 처리하기위한 코드를 작성해야한다.
함수에서 발생한 오류를 해당 함수를 호출한 코드에 알리는 방법이다.
func ABC() -> String
func ABC() throws -> String //throws를 통해 자신을 호출한 코드에게 오류를 던져서 알린다.
try키워드를 통해 던져진 오류를 받을 수 있다. (try?, try!)
자신을 호출한 코드로 던져서 알릴 수는 있지만, 오류를 받은코드가 적절히 오류를 처리해주지 않는다면 이후의 코드는 작동하지 않는다.
함수, 메서드, 이니셜라이저 등에서 오류를 던져주면(throws) 오류발생을 전달받은 코드 블록은 do-catch 구문을 통해 오류를 적절히 처리한다.
do {
try 오류 발생 가능 코드
오류가 발생하지 않으면 실행할 코드
} catch 오류 패턴 1 {
처리코드
} catch 오류 패턴 2 where 추가 조건 {
처리 코드
}
try?를 사용하여 옵셔널 값으로 변환하여 오류를 처리할 수도 있다. try? 표현을 통해 동작하던 코드가 오류를 던지면 그 코드의 반환 값은 nil이 된다.
반환 타입은 반드시 옵셔널로 된다.
.
.
let x: Optional = try? someThrowFunction(shouldThrowError: true)
//nil
.
.
오류가 발생하지 않는다고 확신한다면 오류를 던질 수 있는 함수 등을 호출 할때 try!를 사용할 수 있다.
rethrows 키워드를 사용하여 다시 던지기가 가능한 데, 이때 최소 하나 이상의 오류 발생 가능한 함수를 매개변수로 전달받아야 한다.
다시 던지기는 오류를 다시 던질 뿐 따로 처리는 하지 않는다.
func ABC() throws {
enum SomeError: Error {
case justsomeError
}
throw SomeError.justError
}
func someFunction(callback: () throws -> Void) rethrows { //다시 던짐.
.
.
.
defer 구문을 사용하여 현재 코드 블록을 나가기 전에 꼭 실행해야 하는 코드를 작성해줄 수 있다. 오류처리 상황 뿐아니라 어디서든 사용이 가능하다.
defer { 실행 구문 }