예외를 잡아 놓고 아무 처리 없이 흘려보내는 안티패턴(Anti-pattern). 빈 catch뿐 아니라 debug 레벨로만 찍고 정상인 척 진행하는 것도 마찬가지다.
try {
await saveOrder(order)
} catch (e) {
// 아무것도 안 함 → 호출자는 저장에 성공했다고 믿는다
}왜 문제인가
- 실제로는 실패했는데 호출자는 성공했다고 믿어 버그가 숨는다
- 로그도 스택 트레이스도 남지 않아 운영 중 이상 동작의 원인을 찾을 수 없다
- 일부만 성공한 채 진행하면 데이터 정합성이 깨질 수 있다(데이터 무결성)
대신 할 일
- 다시 던진다: 여기서 할 수 있는 게 없으면 처리할 수 있는 곳으로 넘긴다(예외 처리 원칙)
- 기록하고 의미 있게 바꾼다: 스택 트레이스를 포함해 로그를 남기고 도메인 예외로 감싸 던진다(로그 레벨과 Logback)
- 정말 무시해도 된다면 이유를 적는다: 왜 안전한지 주석으로 남긴다
비동기 코드에서는 catch를 쓰지 않아도 예외가 삼켜진다. 처리되지 않은 Promise 거부(Unhandled Promise Rejection)나 기다리지 않은 asyncio 태스크의 예외가 그렇다(Promise, asyncio 태스크 예외가 조용히 사라지는 문제). 증상만 보고 원인을 좁혀 가는 방법은 디버깅 문제 정의 5단계 참고.