[iOS] 에러 처리 / Error Handling
2024. 12. 30. 15:42ㆍ🍏/Swift
Swift의 에러 처리 방법
Swift에서는 안전하고 명시적인 방식으로 에러를 처리하기 위해 에러 처리 기능을 제공합니다.
Swift의 에러 처리는 에러를 발생시키고(throw), 전파하고(throws), 처리하는(catch) 방식을 기반으로 합니다.
throws, try, catch 키워드의 사용 방법
throws- 에러를 발생시킬 가능성이 있는 함수나 메서드에 사용합니다.
throws를 선언한 함수는 호출할 때 반드시try키워드를 사용해야 합니다.
enum NetworkError: Error { case invalidURL case noResponse } func fetchData(from url: String) throws -> String { guard url.starts(with: "https://") else { throw NetworkError.invalidURL } return "Data from \(url)" }trythrows함수 호출 시 사용하며, 에러가 발생할 가능성을 명시적으로 나타냅니다.- 사용 방법:
try: 에러가 발생하면 호출한 곳으로 전파.try?: 에러를 옵셔널 값으로 변환.try!: 에러를 무시하고 강제로 실행(비추천, 런타임 크래시 가능).
do { let data = try fetchData(from: "https://example.com") print(data) } catch { print("Error occurred: \(error)") }catchdo블록에서 발생한 에러를 처리합니다.- 패턴 매칭을 활용하여 특정 에러 유형을 구분할 수 있습니다.
do { let data = try fetchData(from: "invalid-url") print(data) } catch NetworkError.invalidURL { print("Invalid URL.") } catch { print("Unexpected error: \(error)") }
옵셔널을 사용한 에러 처리와 do-catch를 사용하는 에러 처리의 차이
- 옵셔널 에러 처리 (
try?)- 에러 발생 시
nil을 반환하며, 에러를 무시합니다. - 간단한 에러 처리가 필요한 경우에 유용합니다.
let result = try? fetchData(from: "invalid-url") print(result) // nil
단점: 에러에 대한 세부 정보를 제공하지 않음. - 에러 발생 시
do-catch를 사용한 에러 처리- 에러를 명시적으로 처리하고, 발생한 에러 유형을 구체적으로 확인할 수 있습니다.
do { let data = try fetchData(from: "invalid-url") print(data) } catch { print("Error occurred: \(error)") }
단점: 코드가 더 복잡해질 수 있음.- 에러를 명시적으로 처리하고, 발생한 에러 유형을 구체적으로 확인할 수 있습니다.
에러를 전파하는 방법
throws를 사용하여 전파- 에러를 발생시키고 호출한 곳으로 전달합니다.
- 전파된 에러는
do-catch또는try?를 사용해 처리해야 합니다.func processData() throws { try fetchData(from: "invalid-url") } do { try processData() } catch { print("Error: \(error)") }
- 자동 전파 (
rethrows)- 매개변수로 전달받은 클로저가 에러를 발생시키는 경우에만 전파.
- 주로 고차 함수에서 사용됩니다.
func perform(operation: () throws -> Void) rethrows { try operation() } try perform { throw NetworkError.noResponse }
'🍏 > Swift' 카테고리의 다른 글
| [iOS / macOS] 내 맥북에서 서버를 만들고 내 아이폰과 소켓 통신을 해보자 (0) | 2024.12.31 |
|---|---|
| [iOS] 데이터를 저장하는 방법들 / 간단 예제 (0) | 2024.12.31 |
| [Swift] 접근 제어자(Access Control Levels) (0) | 2024.12.29 |
| [iOS] Protocol / 프로토콜 / 개념 의미 요구사항 확장 POP (0) | 2024.12.29 |
| [Swift] Tail Call Optimization / TCO / 꼬리재귀 (0) | 2024.03.16 |