(편의상 편한 말투로 작성하는 점 이해 부탁드립니다.😅)
(부정확한 정보가 있을 수 있습니다. 지적 환영🤩)
오늘은 Swift에서 예외처리 하는 방법을 알아보도록 하겠습니당!!
Swift에서 예외처리를 하기 위해서는 try-catch 구문을 사용하게 됩니다. 프로그램에서 에러가 발생하는 등 예외 상황에 대응하기 위해 사용합니다. 에러 발생(throwing), 감지(catching), 전파(propagating), 조작(manipulating)을 제공하는 클래스를 지원합니다. 프로그램에서 에러가 발생했을 때 어떤 에러인지에 따라 다르게 대응하기 위해 사용됩니다. 그럼 try-catch를 어떻게 사용하는지에 대해 알아보도록 하겠습니당.
예시
아래 예시 코드를 통해 설명해보겠습니다!
먼저 발생할 수 있는 에러를 enum으로 만들어주고 문자열 또는 에러를 리턴할 수 있는 함수를 만들었습니다. 이 두가지 코드를 보면 함수에 전달되는 배터리잔량을 받아 해당 값에 따라 에러를 방출시킬 수 있다는 걸 알 수 있습니다! 에러를 반환하는 함수를 만들기 위해서는 반환타입 앞에 throws를 붙여주고 실제 에러가 발생하는 부분에 throw를 통해 에러를 발생시킵니다. throw를 통해 에러가 발생하면 해당 함수는 거기서 멈추고 정해진 에러를 반환합니다.
해당 함수를 사용하기 위해서는 do-catch문을 사용해야 합니다. throw가 발생할 수 있는 코드를 do문 안에 넣고 해당 do문 안에서 throw가 발생하면 해당 에러를 catch문이 잡아냅니다. catch문 뒤에 잡아낼 에러를 붙이면 해당 에러가 발생했을 때 해당 catch문이 실행되는 구조!!라고 하면 이해가 되겠죠..?ㅎ
아래 예시에서는 배터리부족과 알 수 없는 에러 두가지를 모두 정의해두었지만 catch 키워드 뒤에 아무 에러도 쓰지 않는다면 해당 catch문 전에 잡아내지 못한 모든 에러를 해당 catch문에서 잡아내 실행하게 됩니다. 모든 에러를 잡아낼 catch문을 쓰지 않았다면 앱이 죽어버릴 수 있으니 조심하는게 좋겠죠??
enum PhoneError: Error {
case unknown
case batteryLow(batteryLevel: Int)
}
func checkPhoneBatteryStatus(batteryLevel: Int) throws -> String {
guard batteryLevel != -1 else { throw PhoneError.unknown }
guard batteryLevel > 20 else { throw PhoneError.batteryLow(batteryLevel: batteryLevel) }
return "배터리 상태가 정상입니다."
}
do {
try checkPhoneBatteryStatus(batteryLevel: 10)
} catch PhoneError.batteryLow(let batteryLevel) {
print("배터리가 부족합니다.")
} catch PhoneError.unknown {
print("알 수 없는 에러입니다.")
} catch {
print("알 수 없는 에러입니다.")
}
try?
try?를 보면 어떤게 달라졌나요? 바로 ?가 생겼다는 겁니다! Swift에서 ?는 뭐라고 했죠?? 맞습니다! 옵셔널을 뜻하죠? try?를 사용하면 따로 do-catch문을 사용하지 않고도 throw 발생 가능한 코드를 처리할 수 있습니다! 그럼 throw가 발생했을 땐 어떻게 동작하게 될까요???위의 코드를 재사용하여 예시를 들어보도록 하겠습니다.
만약 throw를 통해 에러가 반환됐다면 status 변수에는 nil이 할당됩니다. 아니라면 배터리 상태가 정상입니다. 라는 문자열을 할당하게 되겠죠?
enum PhoneError: Error {
case unknown
case batteryLow(batteryLevel: Int)
}
func checkPhoneBatteryStatus(batteryLevel: Int) throws -> String {
guard batteryLevel != -1 else { throw PhoneError.unknown }
guard batteryLevel > 20 else { throw PhoneError.batteryLow(batteryLevel: batteryLevel) }
return "배터리 상태가 정상입니다."
}
var status = try? checkPhoneBatteryStatus(batteryLevel: 10)
print(status) // nil
try!
try?를 보고 try!를 예상하신 분이 계신가요?? 옵셔널답게 nil이 발생하지 않을 것을 장담할 수 있다면 !를 사용해 옵셔널이 아닌 값을 반환 받을 수도 있답니다. 하지만 알다시피 nil이 절대 발생하지 않는다 = 에러가 절대 발생하지 않는다. 이런 상황에 thorw 발생 가능한 코드에서 절대 throw가 발생하지 않는다..? 뭔가 이상하죠? 이런 문법을 사용할 경우가 있을까 싶긴 한데 알아둬서 나쁠 건 없죠 ㅎ.. 다만 try!문을 사용했을 때 throw가 발생하면 옵셔널과 동일하게 앱이 죽어버릴 수 있으니 조심히 사용해야겠네요!
오늘은 Swift에서 예외처리하는 방법을 알아봤습니다! 실제로 많은 상황에 사용해야 할 수 있으니 잘 알아두면 개발할 때 많은 도움이 될 것 같습니다! 앱의 안정성 향상에도 도움이 될 것 같습니다.😀
다음에는 클로저에 대해 알아보도록 하겠습니다! 커밍쑨!
'Swift' 카테고리의 다른 글
[Swift] 고차함수란? (0) | 2023.06.23 |
---|---|
[Swift] Closure(클로저)란? (0) | 2023.06.21 |
[Swift] Extension(익스텐션)이란? (0) | 2023.06.15 |
[Swift] Protocol(프로토콜)이란? (0) | 2023.06.13 |
[Swift] 열거형(Enumeration)이란? (0) | 2023.06.11 |