BOID

[swift] 오류처리에서 rethrows란? -HoonIOS 본문

swift 시작기

[swift] 오류처리에서 rethrows란? -HoonIOS

HoonIOS 2021. 4. 8. 10:59

안녕하세요 HoonIOS입니다. :)

저번에는 try를 통한 오류를 처리하는 방법과  do-catch문을 통해 오류를 잡는 부분에 대해 알아봤습니다.

boidevelop.tistory.com/40

 

[swift] 함수에서 발생한 오류 알리기(try ,try! ,try? , do - catch) - HoonIOS

안녕하세요 HoonIOS입니다. :) 저번에는 오류처리의 정의와 Error 프로토콜, throw에 대해 알아봤습니다. 이제는 오류를 처리하는 방법인 try, try?, try!, Do - catch에 대해 알아보겠습니다. 함수에서 발생

boidevelop.tistory.com

이번에는 다시 던지는 rethrows키워드에 대해 알아보겠습니다.

 

다시 던지기 (rethrows)

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

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

- 다시 던지기 함수 또는 메서드는 기본적으로 스스로 오류를 던질수 없습니다.

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

- do - catch구문 내부의 try 를 이용한 구문에서 오류가 발생하면 오류를 호출하고 catch 절 내부에서 다른 오류를 던짐으로써 오류를 던지는 함수에서 발생한 오류를 제어할 수 있습니다.

- 오류를 다시 던지는 예시

* 코드 설명

- someFunction을 보면 매개변수로 throws를 해주므로 rethrows를 통해 자신의 매개변수로 전달받은 함수가 오류를 던진다는것을 알 수 있습니다.

- do - catch구문을 통해 보면은 try로 somFunction을 통해 somThrowinFunction 오류를 rethrows해주고 그것에 대한 반환된 오류를 catch 해줘서 print를 해주는 것입니다.

 

- Catch절 내에 오류를 던질 수 있는 함수를 알아봅시다.

* 코드 설명

  1. 첫 번째 do - catch함수는 매개변수로 전달한 오류 던지기 함수이므로 catch에서 제어를 할 수 있습니다.
  2. 두 번째 do - catch함수는 매개변수로 전달한 오류 던지기 함수가 아니므로 catch에서 제어를 할 수 없습니다.
  3. 맨 지막 throw AnotherError.justAnotherError는 catch절 외부에서 단독으로 던질 수 없으므로 오류를 던질수 없습니다.

프로토콜 & 클래스에서 throws, rethrows 재정의하기

- 부모 클래스의 다시던지기 메소드(rethrow) 는 자식클래스에서 던지기 메소드(throws)로 재정의 할수 없다.

( 부모클래스의 rethrows -> 자식클래스에서 throws로 재정의 X )

 

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

( 부모클래스의 throws -> 자식클래스에서 rethrows로 재정의 O )

 

- 프로토콜 요구사항 중에서 다시 던지기 메서드(rethrows)가 있다면, 그 메서드를 던지기 메서드(throws)로 구현을 하면 요구사항을 충족시킬 수 없습니다.

( 프로토콜 rethrows -> throws X )

 

- 프로토콜 요구사항 중에서 던지기 메서드(throws)가 있다면 다시 던지기 메서드를 구현해서 요구사항을 충족시킬 수 있습니다.

( 프로토콜 throws -> rethrows O )

 

- 이제 부모 클래스, 자식 클래스에서의 throw, rethrow 재정의 변경, 프로토콜로 메서드 구현할 때 rethrows <-> throws 메서드 재정의를 해봅시다.

* 코드 설명

  1. SomeClass는 SomeProtocol의 프로토콜을 상속한 클래스입니다. Throwing이라는 throws프로토콜 함수를 클래스에서 rethrows로 재구현이 가능하지만 rethrows를 throws로 재정의하는 것은 불가능한 것을 볼 수 있습니다.
  2. SomeClass에 throws와 rethrows 메서드를 정의해주고  이 클래스를 상속받은 SomeChildClass에 rethrows를 throws로 재정의하는 것은 불가능하지만 throws를 rethrows 재정의하는것은 가능한 것을 볼 수 있습니다.

 

이렇게 rethrows 정의와 rethrows, throws를 프로토콜 클래스에서 상속받았을 때 재정의한 것이 가능하고 불가능한 것에 대해 알아봤습니다. 

 

간단하게 오류를 throws 한 메서드를 rethrows를 재 던짐을 해주는 것이라고 생각하면 될 거 같습니다. :) 또 라이브러리에서 많이 보던 코드라 좀 더 공부해야겠다고 생각합니다 ㅎㅎㅎㅎㅎ

반응형
Comments