좋은 질문이야.
**"에러를 어디서 책임져야 하느냐"**는 아래 기준에 따라 결정하는 게 바람직해:
처리 위치 | 책임 대상 | 권장 상황 |
---|---|---|
함수 내부 (호출된 쪽) | 로컬 로직 | 해당 함수만의 예외 처리/복구/대체 로직이 있을 때 |
호출자 (상위) | 전역 흐름 | 에러를 로깅하거나, 사용자에게 에러 메시지를 보여주거나, 트랜잭션을 롤백할 필요가 있을 때 |
이 함수는 에러가 날 수 있다는 걸 자연스럽게 예상할 수 있는가?
try/catch
를 호출 쪽에서)에러가 났을 때 이 함수 내에서 복구 가능하거나 의미 있는 fallback이 있는가?
try/catch
로 잡는 게 맞음에러가 발생했을 때 사용자에게 메시지를 보여주거나 로그로 남겨야 하는가?
async function getUser(id: string) {
try {
return await db.findUserById(id);
} catch {
return null; // 없는 경우 null 처리
}
}
호출자가 이 함수가 null을 반환할 수 있음을 예상해야 함
async function createUser(data: UserDTO) {
const user = await this.userRepo.save(data); // 여기서 실패 가능
this.logger.log(`User ${user.id} created`);
}
이럴 땐 save()
내부에서는 await
없이 에러를 리턴하고, createUser()
에서 try/catch로 전체 흐름 관리하는 게 좋음.
return foo()
로 넘기고await
+ try/catch
혹은 ExceptionFilter
로 처리@Controller()
export class UserController {
@Post()
async create(@Body() dto: CreateUserDto) {
try {
return await this.userService.create(dto);
} catch (e) {
throw new InternalServerErrorException('유저 생성 실패');
}
}
}
return await
을 쓰느냐 마느냐보다,