[Swift] do-try-catch

민경준·2025년 2월 18일
1

🟡 1. do-try-catch 기본 문법

do {
    let result = try someThrowingFunction()
    print("Result: \(result)")
} catch {
    print("Error: \(error)")
}

📌 주요 구성요소:

  • do 블록: try 구문을 포함해 에러가 발생할 수 있는 코드를 실행
  • try: 에러를 던질 수 있는(throwing) 함수 호출 시 반드시 사용
  • catch: 발생한 에러를 포착해 처리
  • error: 발생한 에러가 자동으로 전달되는 에러 객체

🟢 2. do-try-catch 예제

enum MyError: Error {
    case invalidInput
    case unknown
}

func throwingFunction(value: Int) throws -> String {
    if value < 0 {
        throw MyError.invalidInput
    }
    return "Value is \(value)"
}

func testErrorHandling() {
    do {
        let result = try throwingFunction(value: -1)
        print("Success:", result)
    } catch MyError.invalidInput {
        print("🚫 Error: Invalid input")
    } catch {
        print("⚠️ Unknown error:", error)
    }
}

testErrorHandling()

📝 출력 결과:

🚫 Error: Invalid input

💡 포인트:

  • throwingFunction(value:)throws 키워드를 사용했으므로, 반드시 try를 붙여 호출해야 합니다.
  • catch MyError.invalidInput: 구체적인 에러 타입을 포착해 처리 가능
  • 마지막 catch는 모든 기타 에러를 처리

🟠 3. 다양한 try 문법

🟡 1. try? (옵셔널 반환)

  • 에러 발생 시 nil을 반환
  • 에러를 무시하고 단순히 성공/실패 여부만 확인할 때 사용
let result = try? throwingFunction(value: -1)
print(result) // 출력: nil

🟢 2. try! (강제 실행)

  • 에러 발생 시 크래시(앱 종료)
  • 에러가 발생하지 않는다고 확신할 때만 사용
let result = try! throwingFunction(value: 5)
print(result) // 출력: Value is 5

⚠️ 주의: 에러 발생 시 앱이 즉시 종료됩니다.


🟣 3. guard와 try?를 함께 사용 (에러 시 빠른 반환)

func safeFunction() {
    guard let result = try? throwingFunction(value: 10) else {
        print("Invalid result")
        return
    }
    print("Success:", result)
}
safeFunction()
// 출력: Success: Value is 10

🟡 4. rethrows 키워드

  • 클로저에서 에러를 던지는 경우, 함수 자체는 에러를 던지지 않으나 클로저가 에러를 던질 경우에만 에러를 전달하도록 함
func performOperation(_ operation: () throws -> String) rethrows -> String {
    return try operation()
}

do {
    let result = try performOperation {
        throw MyError.unknown
    }
    print(result)
} catch {
    print("Caught error:", error)
}

// 출력: Caught error: unknown

🟠 5. Result 타입과 비교

do-try-catch는 에러 처리 시 제어 흐름 기반입니다. 반면, Result 타입은 값 기반으로 에러를 전달합니다.

✅ Result 타입 예제:

func throwingFunction(value: Int) throws -> String {
    if value < 0 {
        throw MyError.invalidInput
    }
    return "Value is \(value)"
}

let result = Result { try throwingFunction(value: -1) }

switch result {
case .success(let value):
    print("Success:", value)
case .failure(let error):
    print("Failure:", error)
}

🚀 6. 요약

do-try-catch명시적인 에러 처리를 위한 구문
try?try!는 에러 발생 시 옵셔널 반환 또는 크래시 발생
rethrows클로저 에러 전파를 위해 사용
Result 타입은 값 기반 에러 처리do-catch와 상호보완적

profile
iOS Developer 💻

0개의 댓글