[iOS] 에러 처리 / Error Handling

2024. 12. 30. 15:42🍏/Swift

Swift의 에러 처리 방법

Swift에서는 안전하고 명시적인 방식으로 에러를 처리하기 위해 에러 처리 기능을 제공합니다.
Swift의 에러 처리는 에러를 발생시키고(throw), 전파하고(throws), 처리하는(catch) 방식을 기반으로 합니다.


throws, try, catch 키워드의 사용 방법

  1. throws
    • 에러를 발생시킬 가능성이 있는 함수나 메서드에 사용합니다.
    • throws를 선언한 함수는 호출할 때 반드시 try 키워드를 사용해야 합니다.
    enum NetworkError: Error {
        case invalidURL
        case noResponse
    }
    
    func fetchData(from url: String) throws -> String {
        guard url.starts(with: "https://") else {
            throw NetworkError.invalidURL
        }
        return "Data from \(url)"
    }
  2. try
    • throws 함수 호출 시 사용하며, 에러가 발생할 가능성을 명시적으로 나타냅니다.
    • 사용 방법:
      • try: 에러가 발생하면 호출한 곳으로 전파.
      • try?: 에러를 옵셔널 값으로 변환.
      • try!: 에러를 무시하고 강제로 실행(비추천, 런타임 크래시 가능).
    do {
        let data = try fetchData(from: "https://example.com")
        print(data)
    } catch {
        print("Error occurred: \(error)")
    }
  3. catch
    • do 블록에서 발생한 에러를 처리합니다.
    • 패턴 매칭을 활용하여 특정 에러 유형을 구분할 수 있습니다.
    do {
        let data = try fetchData(from: "invalid-url")
        print(data)
    } catch NetworkError.invalidURL {
        print("Invalid URL.")
    } catch {
        print("Unexpected error: \(error)")
    }

옵셔널을 사용한 에러 처리와 do-catch를 사용하는 에러 처리의 차이

  1. 옵셔널 에러 처리 (try?)
    • 에러 발생 시 nil을 반환하며, 에러를 무시합니다.
    • 간단한 에러 처리가 필요한 경우에 유용합니다.
      let result = try? fetchData(from: "invalid-url")
      print(result) // nil
    장점: 코드 간결.
    단점: 에러에 대한 세부 정보를 제공하지 않음.
  2. do-catch를 사용한 에러 처리
    • 에러를 명시적으로 처리하고, 발생한 에러 유형을 구체적으로 확인할 수 있습니다.
      do {
        let data = try fetchData(from: "invalid-url")
        print(data)
      } catch {
        print("Error occurred: \(error)")
      }
    장점: 에러 디버깅 및 세부 처리 가능.
    단점: 코드가 더 복잡해질 수 있음.

에러를 전파하는 방법

  1. throws를 사용하여 전파
    • 에러를 발생시키고 호출한 곳으로 전달합니다.
    • 전파된 에러는 do-catch 또는 try?를 사용해 처리해야 합니다.
      func processData() throws {
        try fetchData(from: "invalid-url")
      }
      
      do {
        try processData()
      } catch {
        print("Error: \(error)")
      }
  2. 자동 전파 (rethrows)
    • 매개변수로 전달받은 클로저가 에러를 발생시키는 경우에만 전파.
    • 주로 고차 함수에서 사용됩니다.
      func perform(operation: () throws -> Void) rethrows {
          try operation()
      }
      
      try perform {
          throw NetworkError.noResponse
      }