특정 이벤트 발생 시 비동기 로직을 처리하고, 해당 로직에서 발생하는 예외를 메인 프로세스에서 캐치하려고 합니다.
코드:
const EventEmitter = require('events');
const emitter = new EventEmitter();
emitter.on('data', async (data) => {
if (data === 'fail') {
throw new Error('Async Error Occurred');
}
console.log('Success');
});
try {
emitter.emit('data', 'fail');
} catch (e) {
console.error('Caught:', e.message);
}
시도: 1. `emit` 호출부를 `try-catch` 블록으로 감싸 처리함.
2. `emitter.on` 내부의 콜백 함수를 `async`로 선언함.
질문: `EventEmitter.emit`은 리턴값으로 리스너들의 실행 결과(Promise)를 반환하지 않는데, 비동기 리스너에서 발생한 에러를 외부에서 어떻게 포착할 수 있습니까?
댓글7
-
빗방울
2026.10.31 06:00
-
빗방울
2026.10.31 06:21
맞아요ㅋㅋ 그냥 에러 이벤트 따로 빼서 관리하는 게
제일 속 편하더라고요.
-
빗방울
2026.10.31 08:10
ㄹㅇㅋㅋ
그냥 맘 편하게 에러 전용 이벤트 하나 파는 게
정신건강에 이롭더라고요ㅋㅋ
-
빗방울
2026.10.31 10:00
ㄹㅇㅋㅋ 그냥 포기하고 에러 이벤트 쓰는 게 답인듯요
아니면 Promise.all 같은 걸로 직접 관리해야 하는데 그건 너무 빡셈ㅋㅋ
-
빗방울
2026.10.31 12:23
ㄹㅇㅋㅋ 맞아요
그냥 래퍼 함수 하나 짜서 리스너들 다 감싸버리는 게 제일 깔끔한 것 같더라고요ㅋㅋ
-
빗방울
2026.10.31 10:24
이거 그냥 냅두면 unhandledRejection 뜨면서 서버 터질 수도 있음ㄷㄷ
리스너 안에서 try-catch 돌려서 에러 잡고
그다음에 에러 이벤트 쏴주는 식으로 짜야 안전할듯요ㅋㅋ
-
빗방울
2026.10.31 11:34
이거 진짜 킹받는 포인트죠ㅋㅋ
차라리 처음부터 EventEmitter 말고 라이브러리 써서 Promise 기반으로 짜는 게 나을 수도 있을듯요.
아니면 그냥 리스너 등록할 때 래퍼 함수 하나 만들어서 처리하는 방법도 있겠네요.
모든 이야기1455
가벼운 안부부터 깊은 생각까지, 함께 나눠요.
이거 원래 emit이 동기적으로 동작해서 그래요.
리스너 내부에서 try-catch로 직접 잡거나
에러 이벤트 따로 만들어서 emit 하는 게 국룰인듯요ㅋㅋ