Swift에서 고급 오류 처리 기술 배우기: 커스텀 에러 타입을 활용한 복잡한 오류 처리 구조.

작성일 :

Swift에서 고급 오류 처리 기술 배우기

Swift는 오류 처리에 있어 강력한 기능을 제공합니다. 기본적인 try, catch 구문 외에도 커스텀 에러 타입을 정의하고 사용하는 방법을 통해 더욱 발전된 오류 처리를 구현할 수 있습니다. 이 글에서는 이러한 기술들을 예제를 통해 자세히 설명합니다.

커스텀 에러 타입 정의하기

Swift에서 커스텀 에러 타입을 정의하는 것은 매우 간단합니다. Swift의 Error 프로토콜을 준수하면 됩니다. 예를 들어, 은행 계좌와 관련된 에러 타입을 정의해 보겠습니다.

swift
enum BankError: Error {
    case insufficientFunds(amountNeeded: Double)
    case accountNotFound
    case unauthorizedAccess
}

이렇게 정의된 BankError는 다양한 상황에서 발생할 수 있는 에러들을 표현할 수 있습니다. insufficientFunds의 경우 요청된 금액이 얼마인지 따로 저장할 수 있습니다.

에러를 던지는 함수 만들기

에러 타입이 정의되었다면, 이제 실제로 에러를 던지는 함수를 작성해보겠습니다. 예를 들어, 은행 계좌의 잔액을 인출하는 함수를 작성해 보겠습니다.

swift
class BankAccount {
    var balance: Double
    
    init(balance: Double) {
        self.balance = balance
    }
    
    func withdraw(amount: Double) throws {
        guard amount <= balance else {
            throw BankError.insufficientFunds(amountNeeded: amount - balance)
        }
        
        balance -= amount
    }
}

이제 withdraw 함수는 인출하려는 금액이 잔액보다 많을 경우 BankError.insufficientFunds 에러를 던지게 됩니다.

에러 처리하기

에러를 던지는 함수를 호출할 때는 do, try, catch 구문을 사용하여 에러를 처리할 수 있습니다. 예제를 통해 알아보겠습니다.

swift
let account = BankAccount(balance: 100.0)

func performWithdrawal(amount: Double) {
    do {
        try account.withdraw(amount: amount)
        print("Successfully withdrew \(amount)")
    } catch BankError.insufficientFunds(let amountNeeded) {
        print("Error: Insufficient funds. You need an additional \(amountNeeded)")
    } catch BankError.accountNotFound {
        print("Error: Account not found.")
    } catch BankError.unauthorizedAccess {
        print("Error: Unauthorized access.")
    } catch {
        print("An unexpected error occurred.")
    }
}

위 코드에서 performWithdrawal 함수는 withdraw 함수 호출 시 발생할 수 있는 여러 종류의 BankError를 처리합니다. 각각의 에러에 대해 특정한 메시지를 출력하는 로직을 구현할 수 있습니다.

에러 전파하기

때로는 에러를 호출한 함수에서 처리하지 않고, 호출된 함수로 전파하고 싶을 수 있습니다. Swift에서는 rethrows 키워드를 사용하여 에러를 호출자에게 전파할 수 있습니다.

swift
func processTransaction(amount: Double, action: (Double) throws -> Void) rethrows {
    try action(amount)
}

try processTransaction(amount: 50) { amount in
    try account.withdraw(amount: amount)
    print("Processed transaction for \(amount)")
}

위 코드에서 processTransaction 함수는 클로저를 인자로 받아 오류 발생 시 호출자에게 전달합니다.

결론

Swift에서 커스텀 에러 타입을 정의하고 사용하는 방법을 통해 고급 오류 처리를 구현할 수 있습니다. 이러한 기술들은 코드의 안정성을 높이고 유지보수를 용이하게 합니다. 이 글에서 소개된 기법들을 활용하여 더욱 효율적이고 견고한 Swift 프로그램을 작성해 보세요.