Mar 05, 2021, TIL (Today I Learned)

Inwoo Hwang·2021년 8월 26일
0
post-thumbnail

학습내용


Do-catch 이해안되는 오류: enclosing catch is not exhaustive

class NumberBaseBall {
    enum GameError: Error {
        case invalidInput
        case unknownError
.
.
.

do {
   pitchedBalls = try checkInvalidInput()
 } catch GameError.unknownError {
   print("입력이 잘못되었습니다.")
   continue outer
            }

do-catch 구문을 활용하여 혼자서 코드를 짜다가 드는 의문점이 있었다. catch문 뒤에 GameError.unknownError 에러패턴을 적으니 try 에서 이런 오류가 나서 당황스러웠다:

Errors thrown from here are not handled because the enclosing catch is not exhaustive

에러처리가 철저하게 되어 있지 않아서 생기는 문제라고 생각되어서 catch문을 하나 더 뒤에 작성한 뒤 나머지는 unknownError패턴 처리를 해 주었으나 역시나 같은 오류가 나는 것을 확인 하였다.

모든 오류 case를 exhaustive 하게 처리한 것 같은데 뭐가 문제인 걸까... 해당 패턴을 지우면 문제가 해결이 되긴 하는데 왜 그런지 이해가 안돼서 고민하는 시간을 가졌다.

1기 캠퍼분께서 이해하기 쉬운 답을 주셔서 블로그에 남겨보고싶다.

"Throw를 게임 에러 형태로 던지지 않고 그냥 단순하게 throw 받는 입장에서는 게임 에러인지 다른 에러인지 알 수 없다. 게임 에러에 대한 핸들링을 걸어놔도 다른 에러가 날 수 있는 가능성도 존재한다." - 소대 -

스위프트의 에러는 모든 에러다 - 소대 -

따라서 특정한 패턴의 오류처리 이외에도 날 수 있는 오류를 처리하기 위한 디폴트 오류처리가 필요한 것 같다.

따라서 그냥 catch {} 구문만 있거나 해당 구문이 포함 되어야 비로소 에러의 늪에서 부터 빠져 나올 수 있었다.

"만약 catch 뒤에 오류의 종류를 명시하지 않고 코드 블록을 생성하면 블록 내부에 암시적으로 error라는 이름의 지역 상수가 오류의 내용으로 들어옵니다."

문제점 / 고민한 점


코드를 뒤돌아서면 까먹어서 어디서부터 어떻게 고처나가야 하는가 고민이 많았다. 자기 객관화가 부족해서 그런건가 하면서 책을 찾아보는데도 책도 눈에 잘 안들어오고 답답한 상황에 처해 있었다.

해결 방법


그래서 무작정 전에 도움을 받으면서 작성했던 코드를 혼자서 작성 해 보았다. 풀면서 생기는 오류들과 문제를 차근차근 읽고 검색하면서 문제의 원인을 찾다보니 자연스럽게 내가 부족한 부분이 무엇인지 인지하게 된다는 것을 깨달았다. 또한 stackoverflow 검색, 구글링, 그리고 캠퍼분들께 질문하면서 내가 고민하고 의문을 가졌던 부분이 해결됨과 동시에 머릿속에 더 오래 남을 것 같다는 생각이 들었다. 그리고 마인드 맵을 작성하면서 다시 한 번 더 내가 공부해야할 것들의 정리가 된 것 같다. 마인드맵이 이렇게 도움이 될줄이야!! 앞으로도 꾸준히 마인드맵을 작성해야 겠다!!!

profile
james, the enthusiastic developer

0개의 댓글