관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] rethrows 예외 처리, 에러 처리 본문

iOS 기본 (swift)

[iOS - swift] rethrows 예외 처리, 에러 처리

jake-kim 2022. 4. 15. 22:37

throws

  • 함수 내부에서 오류를 밖으로 던지고, 사용하는 쪽에서 그 오류를 처리할 때 사용하는 키워드
  • throws키워드는 함수 시그니처의 반환 전 화살표 좌측에 사용
enum MyError: Error {
  case negativeValue
}

func plus(one: Int, two: Int) throws -> Int {
  guard one < 0 && two < 0 else { throw MyError.negativeValue }
  return one + two
}
  • throws 처리 
do {
  let value = try plus(one: -1, two: 2)
  print(value)
} catch {
  print(error)
}

rethrows

https://docs.swift.org/swift-book/ReferenceManual/Declarations.html

  • 파라미터로 전달받은 함수가 에러를 던질 때 사용
    • 이름이 rethrows인 이유: argument 내부에서 에러가 발생하면, 다시 외부러 throws를 던져서 외부에서 처리하게끔하기 위한 방법
  • 함수 준비
enum MyError: Error {
  case negativeValue
}

func plus(one: Int, two: Int) throws -> Int {
  guard one < 0 && two < 0 else { throw MyError.negativeValue }
  return one + two
}
  • 만약 rethrows를 사용하지 않은 경우 -> 사용하는 쪽에서 처리하는게 아닌 함수 내부에서 처리해야 하는 부분이 존재
    • throws는 사용하는 쪽에서 처리하기위해서 나온 개념이므로, throws의 의도와 어긋나는 형태
// 아래처럼 사용하는 쪽에서가 아닌, 함수 내부에서 에러처리를 하는 상황

func someFunc(_ function: (Int, Int) throws -> Int) {
  do {
    print(try function(-1, 0))
  } catch {
    print(error)
  }
}

someFunc(plus(one:two:))
  • retrhows 키워드를 이용하여 사용하는 쪽에서 처리하도록 구현
// rethrows를 통해 받은 argument에서 에러가 발생하면 다시 외부로 에러를 던지는 형태
func retrhowsSomeFunc(_ function: (Int, Int) throws -> Int) rethrows {
  print(try function(2, 1))
}

// 사용하는 쪽에서 에러처리
do {
  try print("결과값 = \(retrhowsSomeFunc(plus(one:two:)))")
} catch {
  print("에러 = \(error)")
}

* 참고

https://docs.swift.org/swift-book/ReferenceManual/Declarations.html

Comments