[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)" }
try
throws
함수 호출 시 사용하며, 에러가 발생할 가능성을 명시적으로 나타냅니다.- 사용 방법:
try
: 에러가 발생하면 호출한 곳으로 전파.try?
: 에러를 옵셔널 값으로 변환.try!
: 에러를 무시하고 강제로 실행(비추천, 런타임 크래시 가능).
do { let data = try fetchData(from: "https://example.com") print(data) } catch { print("Error occurred: \(error)") }
catch
do
블록에서 발생한 에러를 처리합니다.- 패턴 매칭을 활용하여 특정 에러 유형을 구분할 수 있습니다.
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 |