일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- 코드트리챌린지
- 프로그래머스
- frontend
- 코딩테스트실력진단
- 자바스크립트
- 알고리즘
- react
- velog
- UIKit
- iOSDeveloper
- git
- react-query
- 회고
- error
- Apple Developer Academy
- ios
- 프로젝트
- NextJs
- JavaScript
- Front-end
- SWIFT
- AppleDeveloperAcademy
- tshaped
- 프론트엔드
- swiftUI
- Xcode
- TypeScript
- 코딩테스트
- globalcommunity
- 코드트리
- Today
- Total
Moon Work
[Swift] Error Handling 마스터하기(do-catch, throw-try) 본문
Error
삶은 늘 원하는대로 흘러가지 않습니다. 하지만 그런 상황에 대비를 해야 하는 것이 Error Handling입니다.
Error Handling: 에러 처리 또는 ExceptionHandling이라고 말하기도 합니다.
Error Handling을 잘해야 하는 이유
만약 여러분이 은행앱을 통해 돈을 송금하는데 갑자기 “에러입니다.”라고 나오기만 하고 어떤 문제인지 말해주지 않고 앱이 종료된다면 어떨까요? Error Handling은 이러한 상황에서 어떤 에러가 어디서 발생했는지 말해주고, 유저가 앱을 지속적으로 사용하는데 중요한 힌트를 제공합니다. (ex. 잔액이 부족합니다, 계좌가 올바르지 않습니다 등)
Error의 사용
어떤 함수가 에러를 발생할 가능성이 있다면 Swift에서는 함수 선언 시 반드시 throws라는 키워드를 적어야 합니다. functionName() throws { … } 과 같은 형식으로 함수의 선언과 코드블럭 사이에 적어서 에러의 발생 가능성을 명시해야 합니다.
코드블럭: {} 안에 있는 코드의 묶음
Error Protocol
Error Protocol은 비어있는 Empty protocol로 Error를 만들기 위해 사용합니다. Error 프로토콜을 원하는 enum 타입에 적용한 뒤, 에러의 케이스를 설정해주는 것으로 Error 처리를 위한 타입을 커스텀할 수 있습니다.
enum NetworkError: Error {
case invalidAuth
case invalidURL(_ url: URL)
}
protocol: 일종의 청사진, 주물틀과 같은 개념으로 Swift에서 확장과 다형화를 위해 중요하게 사용되는 문법입니다.
Error 처리하기
에러를 발생할 수 있는 함수, 즉 throws가 붙어있는 함수를 어떻게 호출할까요? 이런 함수는 반드시 do-catch 형식 안에 호출해서 에러를 잡을 수 있습니다. 또한 호출하는 함수 앞에 try 키워드를 사용해야 합니다.
do {
let result = try functionName()
} catch(error) {
print(error)
}
/*
기본적으로 설정된 error 키워드를 사용한다면 (error)를 생략할 수 있습니다.
do {
let result = try functionName()
} catch {
print(error)
}
*/
Error 분기 처리하기
위에 코드에서 error에 따른 분기처리를 할 수 있지만 조금 catch를 통해 다양하게 에러를 핸들링할 수 있습니다.
func functionName(urlString: String) throws {
guard let url = URL(string: urlString) else {
throw NetworkError.invalidURL(urlString)
}
}
let url = "www.sampleULR.com"
do {
try functionName(urlString: url)
} catch NetworkError.invalidAuth {
// 오류처리
} catch NetworkError.invalidURL(let urlString) {
// 오류처리
} catch {
// 에러처리
}
try? & try!
try?
만약 에러를 던지는 함수를 호출하면서, 그 에러에 대해 처리하고 싶지 않은 경우는 어떻게 해야할까요? 그런 경우에 사용하는 것이 try? 입니다. try?를 쓰는 경우 do-catch를 쓰지 않고 에러를 발생시킬 수 있는 함수를 호출할 수 있습니다.
try?를 통해 호출한 함수가 에러를 던진다면 그 결과는 nil이 return됩니다. 아래 예시를 통해 이해를 더할 수 있습니다.
let request = try? functionName()
// functionName이 Error를 던진다면 request는 nil이 됩니다.
try!
책임질 수 있다면 사용하세요.
try!는 에러를 던질 수 있는 함수가 절대 에러를 던지지 않을 것이라고 확정하는 것입니다. 따라서 do-catch를 쓰지 않고 아래와 같이 호출을 할 수 있는 것이겠죠. 하지만 정말 에러가 발생할 가능성이 없을 수 있을까요? 만약 에러를 발생시킨다면 이 앱은 꺼져버리게 되는 아주 큰 리스크를 담고 있는 코드입니다.
let request = try! functionName()
참조
'Swift' 카테고리의 다른 글
Swift에서 Unicode.Scalar 다루기 (0) | 2025.04.27 |
---|---|
[Swift] 값타입의 Heap Allocation(Heap boxing)은 언제 일어날까? (0) | 2025.03.06 |
[Swift] Codable 개념 확실히 이해하기 💬 (0) | 2023.10.06 |
[Swift] defer는 무엇인가 🤔 (0) | 2023.10.03 |
[Swift] \. 는 무엇인가 (KeyPath 정리) (0) | 2023.03.23 |