Swift 에러처리

  1. 프로그램에서 에러 발생 : 프로그램 실행 중에 예기치 못한 상황이 발생한 상태로 프로그램이 강제 종료되어 앱이 크래쉬되는 상황 또는 제대로 동작을 수행하지 못하는 상황이 발생한 상태를 의미한다.
    예) 파일 처리 중 디스크 에러, 파일 처리 중 권한 부족으로 인한 에러
  2.  에러 발생 시 사용하는 API
    1. 메소드에 throws 키워드를 넣어 선언
      throws 로 선언
      // 메소드 선언 시에 throws 키워드 사용하여 선언
      func openFile(toFile : String) throws {
         // 파일 열기에 대한 동작 정의
      }

      /* throws로 선언한 메소드는 반드시 try 키워드를 붙여서 사용*/
      try str.openFile(toFile : sFilePath)
      /* 위 상태에서 에러 발생해도 강제 종료가 되며 3번 에러 다루기에서 강제 종료가 발생되지 않도록 처리부분 정의*/
    2. Error 프로토콜을 채택한 객체의 에러 반환
      throw 를 이용한 에러 반환
      /* Enum으로 Error 프로토콜을 채택하여 커스텀 에러 정의
      자세한 것은 4번 커스텀에러에서 다룬다.
      */
      enum CustomError : Error {
         case myFault
         case yourFault
      }

      // 정의된 에러 반환
      func inputPositive(val : Int) throws {
         guard (val > 0) else {
             throw CustomError.yourFault // 에러 반환
             // Error 프로토콜을 채택하면 반환
         }
         print("정상 수행")
      }
  3. 에러 다루기
    1. 에러가 발생하면 앱의 강제 종료를 방지하기 위해서 do-catch 문을 사용한다.
    2. do 내에 코드 실행 중 에러가 발생하게 되면 catch 내 코드를 실행하게 된다.
      do-catch 문 사용
      // 메소드 선언 시에 throws 키워드 사용하여 선언
      func openFile(toFile : String) throws {
         // 파일 열기에 대한 동작 정의
      }

      do {
          try str.openFile(toFile : sFilePath)
      } catch {
          print("파일 열기 중 에러 발생")
      }
      /* do 블록 내의 코드 실행 중에 에러 발생 시 catch 블록 내의 코드를 실행한다.*/
    3. do-catch문은 자바의 try-catch문과 유사하다.
      do-catch 문 사용 (Swift)
      try-catch 문 사용 (Java)
      do {
         // 에러 발생 가능 코드
         try obj.throwsMethod
      } catch {
         // 에러 발생 처리 코드
      }
      try {
         // 에러 발생 가능 코드
      } catch(exception e) {
         // 에러 발생 처리 코드
      }
  4. 커스텀 에러
    1. 특정 에러를 별도로 정의해서 사용하는 것으로 Error 프로토콜을 채택하여 사용한다.
      커스텀 에러 정의
      // enum을 이용한 정의 ()
      enum CustomError : Error {
         case myFault
         case yourFault
      }

      // enum으로 정의된 에러 다루기
      do {
          throw CustomError.yourFault
      } catch CustomError.myFault {
         print("내탓")
      } catch CustomError.yourFault {
         print("니탓")
      }
      // Switch-Case와 비슷하게 사용

      // 구조체를 이용한 정의
      struct CustomErrorStruct : Error {
         var msg : String
      }

      // 클래스를 이용한 정의
      class CustomErrorClass : Error {
      }

      // 구조체나 클래스는 where을 이용한 타입 체크로 구분
      do {
          // 에러 발생 시키기
          let error = CustomErrorStruct(msg : "Oh! My God!!")
          throw error // 에러 반환
      catch where error is CustomErrorStruct {
         print("구조체로 작성한 에러 발생")
      catch where error is CustomErrorClass  {
         print("클래스로 작성한 에러 발생")
      }
  5. 클린업(defer)
    1. 에러가 발생여부와 상관없이 끝나기 전에 블록 내의 코드를 실행한다.
    2. 에러가 발생해도 실행되고, 정상 종료 시에도 실행된다.
    3. 자바의 try-catch-finally에서 finally와 유사한 기능이다.
    4. 사용 방법
      defer 사용법
      // defer는 예외가 발생하는 곳에 작성
      func dangerousFunc() throws {
         defer{
             print("메소드 실행 후 마지막 동작 정의")
         }
         // throw 보다 이전에 작성한다.
         throw CustomErrorStruct(msg : "에러 발생")
      }