[swift] Swift PromiseKit의 예외 처리 방법

PromiseKit은 Swift에서 비동기 작업을 수행할 때 사용되는 인기있는 프라미스 라이브러리입니다. 프라미스를 사용하면 비동기 코드를 보다 간결하고 읽기 쉽게 작성할 수 있습니다. 그러나 때로는 비동기 작업 도중 예외가 발생할 수 있습니다. 이러한 예외를 어떻게 처리해야 할지 알아보겠습니다.

1. 에러 핸들링

PromiseKit은 오류 처리를 위해 자체적으로 Error 타입을 사용합니다. 비동기 작업 중 발생하는 예외를 처리하기 위해 Promise의 .catch 메서드를 사용할 수 있습니다. 다음은 예시 코드입니다.

func fetchData() -> Promise<Data> {
    return Promise { seal in
        // 비동기 작업 수행
        // 예외 발생 시 reject
        // 데이터 반환 시 fulfill
    }
}

fetchData()
    .done { data in
        // 데이터를 사용하는 코드 작성
    }
    .catch { error in
        // 예외 처리 코드 작성
    }

.catch 블록 내에서 예외 처리 코드를 작성할 수 있습니다. 예외가 발생하면 이 블록이 실행되고, error 매개변수로 예외 정보를 받을 수 있습니다.

2. 특정 유형의 에러 처리

PromiseKit에서는 특정 유형의 오류에 대한 처리를 더욱 간략하게 작성할 수 있는 방법을 제공합니다. 예를 들어, 특정 유형의 오류만 처리하고 싶을 때에는 .catch 메서드를 사용하지 않고 .recover 메서드를 사용할 수 있습니다.

enum MyError: Error {
    case authenticationError
    case networkError
    // 다른 유형의 오류 코드
}

func fetchData() -> Promise<Data> {
    return Promise { seal in
        // 비동기 작업 수행
    }
}

fetchData()
    .recover { error -> Promise<Data> in
        if let myError = error as? MyError {
            switch myError {
            case .authenticationError:
                // 인증 오류 처리
            case .networkError:
                // 네트워크 오류 처리
            // 다른 유형의 오류 처리
            }
        }
        throw error
    }
    .done { data in
        // 데이터를 사용하는 코드 작성
    }

.recover 메서드를 사용하여 특정 유형의 오류에 대한 처리를 작성할 수 있습니다. .recover 메서드 블록 내에서 error 매개변수를 통해 예외 정보를 받고, 원하는 처리를 진행한 뒤에는 다시 예외를 발생시켜야 합니다.

3. 여러 개의 에러 핸들링

PromiseKit에서는 여러 개의 오류에 대한 예외 처리를 위해 .catch 블록을 연달아 사용할 수 있습니다. 또는 .recover 메서드를 여러 번 사용하여 각각 다른 처리를 할 수도 있습니다.

func fetchData() -> Promise<Data> {
    return Promise { seal in
        // 비동기 작업 수행
    }
}

fetchData()
    .catch { error1 in
        // 첫 번째 예외 처리
    }
    .catch { error2 in
        // 두 번째 예외 처리
    }
    .catch { error3 in
        // 세 번째 예외 처리
    }
    .done { data in
        // 데이터를 사용하는 코드 작성
    }

.catch 메서드를 연달아 사용하면 여러 개의 예외 처리를 할 수 있습니다. 순서대로 예외가 발생할 때마다 각각 다른 처리를 수행할 수 있습니다.

참고 자료