티스토리 뷰

Combine

Combine ) Operator (9) - Handling Errors

Zedd0202 2020. 10. 24. 10:04
반응형

 

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

오늘은 Combine Operator의 9번째 시간..Handling Errors 섹션입니다.

assertNoFailure(_:file:line:)

catch(_:)

tryCatch(_:)

retry(_:)

 

오늘 볼건 이렇게 4개에요.

assertNoFailure(_:file:line:)


1. 업스트림 Publisher가 실패하면 fatal error를 발생시키고
2. 그렇지 않으면 수신된 모든 입력을 republish하는 친구입니다.

예제를 봅시다.

subject.send(completion: Subscribers.Completion<Error>.failure(SubjectError.genericSubjectError))

제가 Publisher에 error를 명시적으로 보냈습니다. 

그럼 실패했으니까..assertNoFailure()가 fatal error를 발생시키겠죠?

이렇게 fatal error를 발생시키기 때문에 테스트 및 출시 버전 모두에서 조심해야합니다.

Q : 어따써..?

A : 실패하면 fatal error를 일으키고 싶을때...???

...

ㅈㅅㅋ

근데 진짜 그럴때말고 쓸일 없을 듯 합니다..

 

catch(_:)


업스트림 publisher의 오류를 다른 publisher로 대체하여 처리.

에러가 났는데 그 에러를 다른 publisher로 처리할 때 catch를 쓰면 됩니다.

tryLast를 사용했습니다.

5

4

3

2

1

까지 가다가 0을 만나죠. 그리고 guard 조건에 만족하지 못하게 되어서 error를 냅니다.

근데 catch에서 해당 에러를 받습니다. 그리고 Just(-1)이라는 새로운 publisher를 만들어 리턴합니다.

결국 sink에서 -1이라는 값을 받게 됩니다.

쉽죠!?

 

tryCatch(_:)


try~친구들은 항상 

업스트림 publisher의 오류를 다른 publisher로 바꾸거나 새 오류를 발생시켜 처리하는 친구입니다.

tryMap을 사용하여 숫자가 0보다 작으면 error를 던집니다.

-1에서 에러가 발생하게 되고, 그 다음 tryCatch로 들어가게 됩니다.

tryCatch의 정의가 

1. 오류를 다른 publisher로 바꿈

2. 새 오류를 발생시켜 처리.

이잖아요? 여기서는 1번을 사용했네요. 오류를 다른 publisher로 만들었습니다.

그럼 2번을 봅시다.

tryCatch안에서 에러를 던진것을 볼 수 있죠!

error를 던질때, tryCatch안에서 리턴타입을 안써주면 에러가 나더라구요. 그래서 리턴타입도 명시해줬습니다.

catch에서 또 에러를 던지면 위 스트림은 아예 실패하게 되겠죠? 

아무튼 이렇게 쓸 수 있다는거!!

 

retry(_:)


retry..다시 시도하다? 

지정한 횟수까지 업스트림 publisher 구독을 다시 만들려고 시도하는 친구입니다.

보통 네트워킹에서 많이 쓰게 되는 것 같아요.

해당 URL이 valid하다면

sink에서 이런 값을 받을겁니다.

만약 "https://www.example.com2" 이런 valid하지 않은 URL을 넣으면 실패하게 될거고, catch에서

이런 출력을 찍게 되겠죠.

근데 여기서 주의깊게 봐야할건 retry(3)이 있다는겁니다.

print로 찍어보면,

처음 구독을 시작하고, valid하지 않으니 error를 받게 됩니다.

근데 retry가 있으므로 

또 다시!!!! 구독을 요청하게 됩니다. (1번째 retry) 근데 또 실패했죠

(두번째 retry) 또 실패니까 

(세번째 retry)

그럼에도 불구하고 실패이기 때문에 catch에 들어가게 됩니다. 

그리고 스트림 종료. 

 

유용하게 쓰일 수 있겠죠? 

 

Handling Errors 섹션..계속 미루고 미루고...미루다...지금에서야 공부하네요.

하하

틀린부분이 있다면 댓글 남겨주세요!

반응형