why?
최근 API를 다루면서 궁금했던 부분이 do - catch 문이였습니다.
에러처리에 대해 확실하게 짚고 넘어가고자 해당부분에 대해 공부해봤습니다.
간단한 예시를 들어 먼저 사용방법을 익힌 후 추후 깊은 개념에 대해 공부해보겠습니다.
do-catch문이란?
에러를 처리하기위한 하나의 문법이라고 생각하시면 됩니다.
한마디로 그냥 '조치방법'이라고 생각하면 편할 것 같습니다.
사용법
do-catch문은
열거형을 사용해서 에러를 정의해야합니다.
예시를 들어보면서 설명해보겠습니다.
(1) 열거형
do - catch문이 아닌, 갑자기 왠 열거형?이라고 생각하실 수도 있을 것 같습니다.
do - catch문을 사용해서 Error를 처리하고 싶다면,
즉, Error를 미리 방지하고 싶다면, Error에 대한 사전 정의가 필요하겠죠?
이런 이유로 열거형을 사용합니다.
먼저 제 통장을 열거형으로 선언하고, 예측가능한 두 가지 Error를 미리 정의해보겠습니다.
첫번째 case는 제 통장 잔액이 없다는 것이고 (ㅠㅠ)
두번째 case는 남은 금액을 반환해주는 Error를 정의해보았습니다.
enum MyBankBook: Error {
case problemOccurred
case lackOfMoney(balance: Int)
}
(2) throws
예측가능한 두 가지 Error를 알기 위해선,
어떤 상황인지 정확하게 정의해야 해당 Error가 나오겠죠?
만약 통장 잔액이 없다면, throw 구문을 통해 Error를 발생시킬 수도 있습니다.
이걸 오류를 던진다고 말합니다.
아래 2개의 guard문은
잔고가 0원 "미만"이라면, 문제발생이라는 Error를 던지고,
잔고가 0원 "이상"이라면, 입력된 액수만큼 잔액이 남았다는 Error를 던진다는 의미입니다.
2가지 전부 해당사항이 없다면, return문을 통해 작성해주면 됩니다.
func checkMyBankBookStatus(money: Int) throws -> String {
guard money >= 0 else { throw MyBankBook.problemOccurred}
guard money < 0 else { throw MyBankBook.lackOfMoney(balance: money) }
return "알림 없음!"
}
(3) do - catch
이제 오늘의 주제인 do-catch문,
즉, Error를 처리하는 방법에 살펴보겠습니다.
do는 오류를 던져주는 부분
catch는 오류를 처리해주는 부분이라고 생각하시면 편합니다.
(작성방법은 하단에 간단히 작성해놓았으니, 참고하시면 좋을 것 같습니다.)
do {
try 오류 발생 가능 코드
} catch 오류 패턴 {
처리코드
}
이제 위 3가지 식을 이용해서 에러 처리를 진행해보겠습니다.
money라는 상수에
100원, 0원, -100원
총 3가지로 나눠서 대입해보겠습니다.
(4) 적용
이제 실제로 적용을 해보겠습니다.
try문에 제 통장 잔고가 100원, 0원, -100원이 남았다고 설정하고, 오류를 던져봅시다.
정상적인 값이 아니라면
즉, 0 이하의 Int라면, .problemOccurred case에 속할 것이고,
0 이상의 정상적인 Int라면, .lackOfMoney case에 속할 것입니다.
100원
do {
try checkMyBankBookStatus(money: 100)
} catch MyBankBook.problemOccurred {
print("문제가 발생했습니다. 은행에 문의하세요")
} catch MyBankBook.lackOfMoney(let money) {
print("고갱님의 잔액은 \(money)원 입니다.") // 100원
} catch {
print(error)
}
--- console ---
고갱님의 잔액은 100원 입니다.
0원
do {
try checkMyBankBookStatus(money: 0)
} catch MyBankBook.problemOccurred {
print("문제가 발생했습니다. 은행에 문의하세요")
} catch MyBankBook.lackOfMoney(let money) {
print("고갱님의 잔액은 \(money)원 입니다.") // 0원
} catch {
print(error)
}
--- console ---
고갱님의 잔액은 0원 입니다.
-100원
do {
try checkMyBankBookStatus(money: -100)
} catch MyBankBook.problemOccurred {
print("문제가 발생했습니다. 은행에 문의하세요") // 은행에 문의하세요
} catch MyBankBook.lackOfMoney(let money) {
print("고갱님의 잔액은 \(money)원 입니다.")
} catch {
print(error)
}
--- console ---
문제가 발생했습니다. 은행에 문의하세요
console창을 보면,
100원과 0원은 .lackOfMoney case로 들어가는 것을 확인할 수 있고,
0 이하인 값이 들어가면 .problemOccurred case에 속한 걸 알 수 있네요.
do - catch문은 RestAPI를 공부하면서 알아야할 필수적인 부분이였습니다.
먼저 흐름에 대해서만 이해하고, 어느정도 익숙해지면,
개념적인 부분과 다양하게 활용하는 방안도 포함해서 포스팅해보려고 합니다.
오류가 있거나, 피드백이 있다면 언제든지 댓글로 알려주세요!
감사합니다 :)
'iOS > Swift' 카테고리의 다른 글
self 사용(시점)에 관한 고찰 (0) | 2023.01.16 |
---|---|
for - in / forEach 차이점 (0) | 2023.01.14 |
instance init / deinit (생성자, 소멸자) (0) | 2022.05.21 |