본문 바로가기
Languages/Swift

사당 iOS 스터디 5주차 - 오류처리

by 탄이. 2018. 8. 17.

CHAPTER 28 오류처리

__28.1 오류처리란

스위프트의 오류처리 기능을 통해 시스템(예를 들어 운영체제 등 우리가 작성하는 응용프로그램 외부)에서 발생한 오류를 처리할 수 있는 것이 아님을 명심

__28.2 오류의 표현

스위프트에서 오류(Error)는 Error라는 프로토콜을 준수하는 타입의 값을 통해 표현

오류의 종류를 미리 예상한 다음, 오류 때문에 다음에 행할 동작이 정상적으로 진행되지 않을 때라면 오류를 던져(Throw Error)주면 됩니다.

스위프트에서 오류를 처리하기 위한 네 가지 방법

  • 함수에서 발생한 오류를 해당 함수를 호출한 코드에 알리는 방법

  • do-catch 구문을 이용하여 오류를 처리하는 방법

  • 옵셔널 값으로 오류를 처리하는 방법

  • 오류가 발생하지 않을 것이라고 확신하는 방법

__28.3 오류 포착 및 처리

28.3.1 함수에서 발생한 오류 알리기

  • try 키워드로 던져진 오류를 받을 수 있습니다.

  • 함수, 메서드, 이니셜라이저의 매개변수 뒤에 throws 키워드를 사용하면 해당 함수, 메서드, 이니셜라이저는 오류를 던질 수 있습니다.

  • func canThrowErrors() throws -> String

    • 호출했을 때, 동작 도중 오류가 발생하면 자신을 호출한 코드에 오류를 던져서 오류를 알릴 수 있습니다.

  • throws를 포함한 함수, 메서드, 이니셜라이저는 일반 함수, 메서드, 이니셜라이저로 재정의할 수 없습니다. 반대로 일반 함수, 메서드, 이니셜라이저는 throws 함수, 메서드, 이니셜라이저로 재정의할 수 있습니다.

28.3.2 do-catch 구문을 이용하여 오류처리

  • 오류 발생을 전달받은 코드 블록은 do-catch 구문을 사용하여 오류를 처리해주어야 합니다.

  • do 절 내부의 코드에서 오류를 던지면 catch 절에서 오류를 전달받아 적절이 처리

    do{ 
       try오류 발생 가능 코드  
      오류가 발생하지 않으면 실행할 코드  
    }catch오류 패턴 1{ 
      처리 코드  
    }catch오류 패턴 2where추가 조건 { 
      처리 코드  
    } 
  • catch 뒤에 오류의 종류를 명시하지 않고 코드 블록을 생성하면 블록 내부에 암시적으로 error라는 이름의 지역 상수가 오류의 내용으로 들어옵니다.

28.3.3 옵셔널 값으로 오류처리

  • try? 표현을 통해 동작하던 코드가 오류를 던지면 그 코드의 반환 값은 nil

  • 오류가 발생하지 않으면 옵셔널 값으로 반환

  • do-catch 구문을 사용하지 않더라도 옵셔널을 사용하여 오류를 처리할 수도 있습니다.

  • 반환 타입이 Int라도 try? 표현을 사용하면 반환 타입이 옵셔널이 된다는 점

  • 반환 타입으로 옵셔널을 활용하던 방법과 결합하여 사용할 수도 있습니다.

28.3.4 오류가 발생하지 않을 것이라고 확신하는 방법

  • 오류가 발생하지 않을 것이라는 전제하여 try! 표현을 사용할 수 있습니다.

    • 런타임 오류

28.3.5 다시던지기

  • 함수나 메서드는 rethrows 키워드를 사용하여 자신의 매개변수로 전달받은 함수가 오류를 던진다는 것을 나타낼 수 있습니다.

  • 다시던지기가 가능하게 하려면 최소 하나 이상의 오류 발생 가능한 함수를 매개변수로 전달받아야 합니다.

  • 자신 내부에 직접적으로 throw 구문을 사용할 수 없습니다. 그러나 catch 절 내부에서는 throw 구문을 작성할 수 있습니다.

  • 부모클래스의 다시던지기 메서드(rethrows 메서드)는 자식클래스에서 던지기 메서드(throws 메서드)로 재정의할 수 없습니다. 그러나 부모클래스의 던지기 메서드는 자식클래스에서 다시던지기 메서드로 재정의 할 수 있습니다.

28.3.6 후처리 defer

  • defer 구문을 사용하여 현재 코드 블록을 나가기 전에 꼭 실행해야 하는 코드를 작성

  • 오류가 발생하여 코드 블록을 빠져나가는 것이든, 정상적으로 코드가 블록을 빠져나가는 것이든 간에 defer 구문은 코드가 블록을 빠져나가기 전에 무조건 실행되는 것을 보장

  • defer 구문과 오류처리

    • defer 구문은 오류처리 상황뿐만 아니라 함수, 메서드, 반복문, 조건문 등등 보통의 코드 블록 어디에서든 사용할 수 있습니다.

  • 파일쓰기 예제에서 defer 구문이 없다면

    • defer 구문이 없었다면 중복된 코드가 많아질 것이고 차후 유지관리가 어려울뿐더러 코드가 길어지다보면 프로그래머가 파일닫기 코드를 닫지 않는 실수를 할 가능성도 높아집니다.

  • defer 구문의 실행 순서

    • defer 구문은 현재 코드 범위를 벗어나기 전까지 실행을 미루고(defer) 있다가 프로그램 실행 흐름이 코드 범위를 벗어나기 직전 실행

    • defer 구문 내부에는 break, return 등과 같이 구문을 빠져나갈 수 있는 코드 또는 오류를 던지는 코드는 작성하면 안 됩니다.

    • 여러 개의 defer 구문이 하나의 범위(블록) 내부에 속해 있다면 맨 마지막에 작성된 구문부터 역순으로 실행

  • 복합적인 defer 구문의 실행 순서

    • do 구문을 catch 절과 함께 사용하지 않고 단독으로 사용할 수도 있습니다.

    • 코드 블록 내부에 또 한 단계 하위의 블록을 만들고자 할 때






참고


야곰의 스위프트 프로그래밍 https://book.naver.com/bookdb/book_detail.nhn?bid=12571019

댓글