에러 처리란 프로그램 실행 중 발생할 수 있는 문제를 안전하게 처리하는 방법입니다.
Swift에서는 Error 프로토콜을 따르는 타입으로 에러를 표현하고, do-try-catch 구문을 통해 에러를 처리합니다.
에러를 정의하려면 Error 프로토콜을 채택한 enum을 사용합니다.
enum NetworkError: Error {
case badURL
case timeout
case unauthorized
}
throws를 붙입니다.func fetchData(from url: String) throws {
guard url.hasPrefix("https") else {
throw NetworkError.badURL
}
// ...
}
throws 함수 호출 시 사용합니다.| 키워드 | 설명 |
|---|---|
try | 반드시 do-catch로 감싸야 함. 에러 발생 시 catch 블록으로 이동 |
try? | 에러 발생 시 nil을 반환. 옵셔널로 결과 처리 |
try! | 에러가 발생하지 않을 거라고 확신할 때 사용. 발생 시 런타임 크래시 |
// 일반 try
do {
try fetchData(from: "http://apple.com")
} catch {
print("에러 발생: \(error)")
}
// try? - 에러 발생 시 nil
let result = try? fetchData(from: "http://apple.com")
// try! - 에러 발생하면 앱 크래시
try! fetchData(from: "https://apple.com")
do-catch를 사용합니다.catch 블록은 여러 개 지정 가능하며, 특정 에러만 분기할 수도 있습니다.do {
try fetchData(from: "http://apple.com")
} catch NetworkError.badURL {
print("잘못된 URL입니다.")
} catch {
print("기타 에러: \(error)")
}
| 구분 | try? | do-catch |
|---|---|---|
| 반환 타입 | 옵셔널 값 (T?) | 일반적인 값 또는 에러 처리 로직 수행 |
| 용도 | 간단한 실패 처리 | 복잡한 에러 대응 및 분기 |
| 에러 핸들링 | nil로 처리 | 다양한 catch 블록을 통해 상세 처리 가능 |
let data = try? fetchData(from: "http://apple.com") // 실패 시 nil
do {
try fetchData(from: "http://apple.com")
} catch {
print("에러 처리")
}
throws를 사용해 전파합니다.func loadUserData() throws {
try fetchData(from: "http://apple.com")
}
func startApp() {
do {
try loadUserData()
} catch {
print("에러 전파 받아서 처리함: \(error)")
}
}
| 키워드 | 설명 |
|---|---|
throws | 에러 발생 가능 함수 선언 시 사용 |
throw | 실제 에러 발생 시 사용 |
try / try? / try! | 에러 발생 가능 함수 호출 시 사용 |
do-catch | 에러를 잡고 처리하는 구조 |
| 에러 전파 | throws로 함수 간 전달 가능 |
enum LoginError: Error {
case invalidUsername
case invalidPassword
}
func login(username: String, password: String) throws {
guard username == "admin" else {
throw LoginError.invalidUsername
}
guard password == "1234" else {
throw LoginError.invalidPassword
}
print("로그인 성공!")
}
do {
try login(username: "admin", password: "0000")
} catch LoginError.invalidUsername {
print("아이디가 잘못되었습니다.")
} catch LoginError.invalidPassword {
print("비밀번호가 잘못되었습니다.")
} catch {
print("알 수 없는 에러: \(error)")
}