-
Swift - Error Handling(do-catch, try?, try!)Programming/Swift 2022. 3. 29. 23:12
안녕하세요 BeePeach입니다.
오늘은 Error Handling 방법 중에 2, 3번째에 해당하는 do-catch와 Optional try에 대해서 공부해보도록 하겠습니다.
try와 do-catch
일반적인 try는 이전 포스팅에서 사용해봤습니다.
그냥 try를 사용했더니 Error를 handling하고 있지 않다고 컴파일 에러가 나서 throws를 추가해 문제를 해결했습니다.
이 방법은 4가지 방법중 첫 번째 방법인 propagating error입니다.
throws를 사용하지않고 try를 사용하는 방법은 do-catch문과 함께 사용하는 것입니다.
do-catch
do-catch문은 Error 예외처리를 할 때 많이 사용하는 방법입니다.
do 안에서 try와 함께 Error를 throw하는 코드를 호출합니다.
그리고 아무런 에러가 발생하지 않았다면 원하는대로 나머지 코드를 작성하면 됩니다.
catch는 do에서 작성한 코드에 Error가 발생했을 때 예외처리를 하는 부분입니다.
이때 pattern matching을 사용해서 Error별로 따로 처리할 수도 있고 한 번에 모두 처리할 수 도 있습니다.
그리고 do-catch로 try로 발생가능한 Error를 모두 처리했다면 throws를 사용하지 않아도 더 이상 Error를 handling 하고 있지 않는다는 에러가 발생하지 않습니다.
그럼 문법부터 보도록 하겠습니다.
do - catch에서 do는 필수적인 부분입니다.
catch는 없어도 되는 부분이지만 catch가 없거나 catch로 발생 가능한 Error의 모든 부분을 처리하지 못한다면 throws 키워드를 이용해서 propagating Error를 해야 합니다.
do 코드 블록 안에서 try를 이용해 throws 함수를 호출합니다.
만약 Errorr가 발생하지 않고 무사히 실행되면 바로 아래에 코드가 실행됩니다.
만약 Error가 발생한다면 catch문으로 넘어가게 됩니다.
여기서 패턴 매칭을 이용해서 각 Error에 맞는 예외 처리를 해주면 됩니다.
where을 이용해서 조건을 추가하거나 ,(comma)를 이용해서 여러 개의 패턴을 한 번에 매칭 하는 것도 가능합니다.
그럼 바로 예시를 보도록 하겠습니다.
이전 포스팅에서 사용했던 예시를 사용하도록 하겠습니다.
VendingMachine이라는 class와 Error를 정의했습니다.
이전에는 throws로 만들었던 buyFavoritesDrink 함수입니다.
하지만 이번에는 throws 키워드를 삭제했습니다.
대신 do-catch문을 선언하고 여기서 try를 사용했습니다.
만약 vend(itemNamed:) 메서드가 Error 없이 실행된다면
"Get Drink!!"라는 문구가 실행됩니다.
하지만 Error가 발생한다면 아래 catch문으로 넘어가게 되고 패턴에 맞는 코드가 실행되게 됩니다.
여기선 coin이 부족해서 500원을 더 넣어주라는 문구가 실행됩니다.
Catch 주의사항
catch문을 사용할 때는 catch의 순서에 주의해야 합니다.
if else 문을 생각하시면 이해하기 쉽습니다.
catch문은 위에서부터 매칭을 하기 때문에 만약 맨 위의 catch문에서 광범위한 error를 처리하게 되면 대부분의 에러는 여기에 걸리고 맙니다.
그래서 catch를 작성할 때는 까다로운 조건부터 작성해주어야 합니다.
예를 들어서 위 예시에서 catch를 가장 위로 올려보겠습니다.
catch문의 위치만 변경됐을 뿐인데 결과가 달라졌습니다.
모든 catch는 맨 처음 catch문에 걸리므로 어떤 Error가 발생해도 해당 catch문만 실행되게 됩니다.
사실상 아래 코드는 의미가 없어진 것입니다.
그다음 주의사항은 catch로 모든 Error를 처리하지 못했다면 throws로 Error를 전파해야 합니다.
이 예제에서는 catch문으로 try로 실행된 throws 메서드의 모든 Error를 처리하지 못했습니다.
VendingMachineError.insufficientFunds 경우가 빠졌죠.
그렇다면 이전에 try를 혼자 사용했던 것처럼 Error를 handling하지 못했다는 에러가 발생합니다.
그래서 이전에 하던 것과 마찬가지로 함수 파라미터 뒤에 throws 키워드를 이용해서 이 함수가 Error를 전파할 수 있도록 해줘야 합니다.
그래서 예제에 보면 throws 키워드가 추가된 것을 확인할 수 있습니다.
Optioanl try
try에는 try? try! 키워드도 존재합니다.
? 과 !를 보면 떠오르는 것은 Optional이죠.
이 키워드도 Optional과 관계가 있습니다.
try? 는 Optional try라고 불립니다.
만약 Error가 발생한다면 nil이 리턴됩니다.
try!는 Forced try라고 불립니다.
try!는 Error가 발생하지 않는다고 확실할 때 사용합니다.
그럼 do-catch 또는 throws를 사용하지 않고 throws 함수를 쉽게 실행할 수 있습니다.
하지만 만약 Error가 발생한다면 crash가 발생합니다.
편리하지만 되도록 사용하지 않아야 하는 키워드입니다.
예시에서는 랜덤 한 number를 생성하고 만약 0보다 작다면 NumberError.negativeNumber Error를 던지고 아니라면 number를 리턴하는 함수를 정의했습니다.
그리고 이 함수를 호출하는데 do-catch를 쓰지 않고 바로 try?를 이용해서 호출했습니다.
만약 에러가 발생한다면 x에는 Error가 담기는 게 아니라 nil이 할당됩니다.
이 코드는 아래 do-catch로 작성한 코드와 같은 코드입니다.
실패하면 nil이 리턴되므로 주로 optional binding과 함께 사용됩니다.
예시를 하나 더 보도록 하겠습니다.
이렇게 do-catch로 작성해야 하는 코드를 optional binding과 함께 사용해서 작성할 수 있습니다.
728x90'Programming > Swift' 카테고리의 다른 글
Swift - Result Type (0) 2022.03.30 Swift - Error Handling (throws와 rethrows) (0) 2022.03.27 Swift - Error Handling(throws) (0) 2022.03.25 Swift - Error Handling 기초 (0) 2022.03.24 Swift - UserDefaults에 customType 저장하기 (0) 2022.03.01