[swift] Swift PromiseKit의 예외 처리

PromiseKit은 비동기 작업을 간편하게 처리하기 위한 Swift 라이브러리입니다. 하지만 때로는 PromiseKit에서 발생하는 예외를 처리해야 할 수도 있습니다. 이번 블로그 포스트에서는 Swift PromiseKit에서 예외 처리를 하는 방법에 대해 알아보겠습니다.

1. catch를 사용한 예외 처리

PromiseKit의 핵심은 catch 함수입니다. catch 함수는 Promise 객체에서 발생하는 예외를 처리하기 위해 사용됩니다. catch 함수는 Error 객체를 받아들이는 클로저를 파라미터로 사용합니다.

예를 들어, 다음과 같은 비동기 작업을 수행하는 Promise 객체가 있다고 가정해봅시다.

func fetchData() -> Promise<Data> {
    return Promise<Data> { seal in
        // 비동기 작업 수행
        
        if success {
            seal.fulfill(data)
        } else {
            seal.reject(MyError.failedToFetchData)
        }
    }
}

위 예제에서 seal.reject(MyError.failedToFetchData)는 데이터를 가져오지 못했을 때 발생하는 예외입니다. 이 예외를 catch 함수로 처리하려면 다음과 같이 작성할 수 있습니다.

fetchData()
    .then { data in
        // 데이터 처리
        
        . . .
    }
    .catch { error in
        // 예외 처리
        
        if let myError = error as? MyError {
            // MyError에 대한 예외 처리
            . . .
        } else {
            // 다른 예외 처리
            . . .
        }
    }

catch 함수에서는 error 매개변수를 통해 예외를 받아들일 수 있습니다. 이후 해당 예외를 처리하는 로직을 작성할 수 있습니다.

2. recover를 사용한 예외 처리

recover 함수는 catch 함수와 비슷하지만, 예외를 처리하고 실패한 Promise를 대체하는 데 사용됩니다. recover 함수는 별도의 Promise 객체를 반환합니다.

다음은 recover 함수의 예제입니다.

fetchData()
    .then { data in
        // 데이터 처리
        
        . . .
    }
    .recover { error -> Promise<Data> in
        // 예외 처리 및 대체 로직
        
        if let myError = error as? MyError {
            // MyError에 대한 예외 처리 및 대체 로직
            . . .
            
            return fetchDataFromAnotherSource()
        } else {
            // 다른 예외 처리 및 대체 로직
            . . .
            
            return Promise<Data>(error: error)
        }
    }

recover 함수에서는 error 매개변수를 통해 예외를 받아들일 수 있습니다. 이후 해당 예외를 처리하고 대체할 Promise 객체를 반환합니다.

3. ensure를 사용한 후처리

Promise 객체에서 catchrecover 함수를 사용하여 예외를 처리하고 대체한 후에도 추가적으로 후처리 작업을 수행해야 할 수 있습니다. 이때 ensure 함수를 사용할 수 있습니다.

ensure 함수는 Promise 객체가 성공하거나 실패했다는 상관없이 항상 실행되는 클로저를 받아들입니다.

예를 들어, 다음과 같이 ensure 함수를 사용할 수 있습니다.

fetchData()
    .then { data in
        // 데이터 처리
        
        . . .
    }
    .catch { error in
        // 예외 처리
        . . .
    }
    .ensure {
        // 후처리 작업
        
        . . .
    }

위 예제에서 ensure 함수는 예외 처리 및 데이터 처리 이후에 항상 실행되는 후처리 작업을 처리하고 있습니다.

위의 예제들은 PromiseKit의 예외 처리에 대한 간단한 설명입니다. 다양한 상황에 맞게 예외 처리 방법을 조합하여 사용할 수 있으며, catch, recover, ensure 함수 등을 적절하게 활용하면 좀 더 견고하고 안전한 코드를 작성할 수 있습니다.

더 자세한 내용은 PromiseKit 공식 문서를 참조해 주세요.