BOID
[swift] 오류처리에서 rethrows란? -HoonIOS 본문
안녕하세요 HoonIOS입니다. :)
저번에는 try를 통한 오류를 처리하는 방법과 do-catch문을 통해 오류를 잡는 부분에 대해 알아봤습니다.
이번에는 다시 던지는 rethrows키워드에 대해 알아보겠습니다.
다시 던지기 (rethrows)
- 함수나 메서드 rethrows 키워드를 사용하여 자신의 매개변수로 전달받은 함수가 오류를 던진다는 것을 나타낼 수 있습니다.
- rethrows키워드를 사용하여 다시던지기가 가능하게 하려면 최소 하나 이상의 오류발생 가능한 함수를 매개변수로 전달받아야 합니다.
- 다시 던지기 함수 또는 메서드는 기본적으로 스스로 오류를 던질수 없습니다.
- 자신 내부에서 직접적으로 throw구문을 사용할수는 없으나 catch절 내부에서는 throw구문을 사용할 수 있습니다.
- do - catch구문 내부의 try 를 이용한 구문에서 오류가 발생하면 오류를 호출하고 catch 절 내부에서 다른 오류를 던짐으로써 오류를 던지는 함수에서 발생한 오류를 제어할 수 있습니다.
- 오류를 다시 던지는 예시
* 코드 설명
- someFunction을 보면 매개변수로 throws를 해주므로 rethrows를 통해 자신의 매개변수로 전달받은 함수가 오류를 던진다는것을 알 수 있습니다.
- do - catch구문을 통해 보면은 try로 somFunction을 통해 somThrowinFunction 오류를 rethrows해주고 그것에 대한 반환된 오류를 catch 해줘서 print를 해주는 것입니다.
- Catch절 내에 오류를 던질 수 있는 함수를 알아봅시다.
* 코드 설명
- 첫 번째 do - catch함수는 매개변수로 전달한 오류 던지기 함수이므로 catch에서 제어를 할 수 있습니다.
- 두 번째 do - catch함수는 매개변수로 전달한 오류 던지기 함수가 아니므로 catch에서 제어를 할 수 없습니다.
- 맨 지막 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 메서드 재정의를 해봅시다.
* 코드 설명
- SomeClass는 SomeProtocol의 프로토콜을 상속한 클래스입니다. Throwing이라는 throws프로토콜 함수를 클래스에서 rethrows로 재구현이 가능하지만 rethrows를 throws로 재정의하는 것은 불가능한 것을 볼 수 있습니다.
- SomeClass에 throws와 rethrows 메서드를 정의해주고 이 클래스를 상속받은 SomeChildClass에 rethrows를 throws로 재정의하는 것은 불가능하지만 throws를 rethrows 재정의하는것은 가능한 것을 볼 수 있습니다.
이렇게 rethrows 정의와 rethrows, throws를 프로토콜 클래스에서 상속받았을 때 재정의한 것이 가능하고 불가능한 것에 대해 알아봤습니다.
간단하게 오류를 throws 한 메서드를 rethrows를 재 던짐을 해주는 것이라고 생각하면 될 거 같습니다. :) 또 라이브러리에서 많이 보던 코드라 좀 더 공부해야겠다고 생각합니다 ㅎㅎㅎㅎㅎ
'swift 시작기' 카테고리의 다른 글
[swift] 스위프트에서 메모리충돌 & 대처 - HoonIOS (0) | 2021.04.11 |
---|---|
[swift] 후처리 defer란? - HoonIOS (0) | 2021.04.08 |
[swift] 함수에서 발생한 오류 알리기(try ,try! ,try? , do - catch) - HoonIOS (3) | 2021.04.06 |
[swift] 오류처리란? -HoonIOS (0) | 2021.04.06 |
[swift] 획득목록(Capture list), 캡쳐리스트 란? -HoonIOS (0) | 2021.04.05 |