예외처리(throw, do-catch, try)

라무·2023년 8월 9일

필요한 이유

💡 optional타입은 오류가 발생했을 때 오류에 대한 정보를 외부로 전달할 방법이 없어서

구현방법

  • 함수가 반환할 오류는 일관된 카테고리로 묶이는 경우가 많다
  • 일관된 주제를 표현하기에 즉, 카테고리화 하기에 좋은 것은 enum형 타입이다
  1. enum에 오류타입명 정의

    • enum형으로 error타입명 정의
      enum ApiError : Error {
          case badUrl
          case parsingError
          case noContent
          case decodingError
          case badStatus(code: Int)
          case unknownError(_ error: Error)
      }
  2. 오류가 나는 조건을 명시&오류 던지기(보내기): throws와 throw로 선언

    • 오류가 발생할 수 있다는 것을 표현: throws
      • throws를 -> 앞에 표시한다

      • 반환 전에 오류가 발생하면, 오류 객체를 반환한다는 것을 의미한다

        public func parse(_ value: String) throws -> Format.FormatInput
    • 오류가 발생했다는 것을 표현: throw
      • throw와 오류명을 넣는다
      • throw를 통해서 에러를 던진다
        • 즉, 오류를 처리해주는 곳으로 전달해준다

    Untitled

  3. do-try-catch로 오류 처리하기(throw를 통해서 던진 에러 받아서 처리하기)

    • 오류가 발생하는 메소드는 try를 앞에 써줘야 한다
      • try의 의미: 아,,, 에러 날수 있기는 한데 일단 한번 해보기는 할께,,,

      • try의 종류
        - try: 예외 발생시 catch로 예외 정보를 던지며, 성공하는 경우 언랩핑된 값을 반환한다
        - try!: 함수 강제 실행
        - 런타임 오류가 발생할 수 있다
        - try? : 에러가 발생하면 nil리턴
        - 에러가 발생하지 않으면 Optional타입으로 리턴된다

        Untitled

    • do-catch로 감싸줘야 에러 처리가능
      • 마지막 catch에 <오류타입>을 작성하지 않으면 default문으로 된다

    Untitled

주의사항

  • throw와 throws는 오류가 나는 조건을 명시하고 오류를 던져준다 오류가 난다는 것을 명시해주는 것
  • do, try, catch는 오류를 처리하는 구문으로 직접 함수를 이용하는 곳에서 처리한다

예시

import UIKit

enum MyError: Error { //Error를 카테고리로 정리
    case numberError
}

func saySomething(number: Int) async throws -> String { //'saySomething이라는 함수는 에러를 던질거야'를 표시 -> throws
    if number == 3 {
        throw MyError.numberError //'MyError.numberError라는 에러를 던질거야' -> throw
    }
    return "마이넘버: \(number)"
}

Task{
    do { //try인 구문을 실행을 할꺼야
        let result1 = try await saySomething(number: 2) //'에러가 날 수도 있는데 시도는 해볼께' -> try
        let result2 = try? await saySomething(number: 1) //'에러가 날 수도 있는데 시도도 해볼꺼야 근데 에러는 처리하지 않을 꺼야' -> try?
        let result3 = try await saySomething(number: 3) //여기서는 에러 발생
    } catch { //에러가 날 경우 catch를 통해서 에러를 잡아서 해결할거야
        print("error: \(error)") //catch에서는 그냥 error라고 들어온다 //error: numberError\n
    }
}

참고한 사이트

[swift] 12. 예외 처리 (throws, throw, do - try - catch)

[Swift] 예외처리 (throws, do-catch, try) 하기

profile
ios 개발을 하고있는 라무의 사적인 기술 블로그

0개의 댓글