내일배움캠프 30일차

임클·2025년 4월 11일

내일배움캠프

목록 보기
31/44
post-thumbnail

📘 TIL: Swift의 에러 처리(Error Handling)

1. ✅ 에러 처리란?

에러 처리란 프로그램 실행 중 발생할 수 있는 문제를 안전하게 처리하는 방법입니다.

Swift에서는 Error 프로토콜을 따르는 타입으로 에러를 표현하고, do-try-catch 구문을 통해 에러를 처리합니다.


2. ⚠️ 에러 정의 방법

에러를 정의하려면 Error 프로토콜을 채택한 enum을 사용합니다.

enum NetworkError: Error {
    case badURL
    case timeout
    case unauthorized
}

3. 🔁 throws / try / catch 키워드

3.1 throws

  • 에러를 발생시킬 수 있는 함수에 사용합니다.
  • 함수 정의에 throws를 붙입니다.
func fetchData(from url: String) throws {
    guard url.hasPrefix("https") else {
        throw NetworkError.badURL
    }
    // ...
}

3.2 try

  • throws 함수 호출 시 사용합니다.
  • 3가지 try 방식이 있습니다:
키워드설명
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")

4. 🧲 do-catch 문법

  • 에러를 안전하게 처리하려면 do-catch를 사용합니다.
  • catch 블록은 여러 개 지정 가능하며, 특정 에러만 분기할 수도 있습니다.
do {
    try fetchData(from: "http://apple.com")
} catch NetworkError.badURL {
    print("잘못된 URL입니다.")
} catch {
    print("기타 에러: \(error)")
}

5. ❓ try? vs do-catch 차이점

구분try?do-catch
반환 타입옵셔널 값 (T?)일반적인 값 또는 에러 처리 로직 수행
용도간단한 실패 처리복잡한 에러 대응 및 분기
에러 핸들링nil로 처리다양한 catch 블록을 통해 상세 처리 가능
let data = try? fetchData(from: "http://apple.com") // 실패 시 nil

do {
    try fetchData(from: "http://apple.com")
} catch {
    print("에러 처리")
}

6. 🔗 에러 전파 방법

  • 에러를 직접 처리하지 않고 호출한 쪽으로 전달하고 싶을 땐 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)")
}

0개의 댓글