[typescript] 비동기 함수의 예외는 어떻게 전달되나요?

비동기 함수와 예외 처리

보통 JavaScript/TypeScript에서 비동기 함수는 Promise나 async/await를 사용하여 구현됩니다. 이러한 방식으로 실행되는 함수에서 예외가 발생하면 이 예외를 어떻게 처리할지 고려해야 합니다.

Promise를 사용한 비동기 함수의 예외 처리

Promise를 사용하여 비동기 함수를 작성하는 경우, 함수 내에서 발생한 예외는 해당 Promise 객체를 reject하는 형태로 전달됩니다. 이후에는 catch를 사용하여 예외를 처리할 수 있습니다. 예를 들면:

function asyncFunction(): Promise<string> {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            try {
                // 예외가 발생할 수 있는 작업
                throw new Error('예외 발생!');
                resolve('완료');
            } catch (error) {
                reject(error);
            }
        }, 1000);
    });
}

asyncFunction().then((result) => {
    console.log(result);
}).catch((error) => {
    console.error('에러 발생:', error);
});

async/await를 사용한 비동기 함수의 예외 처리

async/await는 Promise를 기반으로 동작하며, async 함수 내에서 발생한 예외는 해당 Promise를 reject하는 방식으로 처리됩니다. 이후에는 try/catch 블록을 사용하여 예외를 캐치할 수 있습니다. 예를 들면:

async function asyncFunction(): Promise<string> {
    try {
        // 예외가 발생할 수 있는 작업
        throw new Error('예외 발생!');
        return '완료';
    } catch (error) {
        throw error;
    }
}

(async () => {
    try {
        const result = await asyncFunction();
        console.log(result);
    } catch (error) {
        console.error('에러 발생:', error);
    }
})();

결론

JavaScript/TypeScript의 비동기 함수에서 예외는 Promise 객체를 통해 전파되며, 이를 catch나 try/catch를 통해 적절히 처리할 수 있습니다. 이를 통해 프로그램이 예외 상황에서도 안정적으로 동작할 수 있도록 보장할 수 있습니다.

참고 자료: MDN web docs - Handling rejected promises, MDN web docs - Async Functions