全书目录

第七篇:NestJS 完全指南 —— 国际机场总调度宇宙

第十二章:Exception Filter —— 真出事故时,要有应急中心统一接管

1 分钟 275 字 第 192 / 962 个阅读单元

后端系统一定会报错。
NestJS 的思路不是“每个 controller 各自 try/catch 一遍”,而是提供统一异常层。

最常见写法:

ts
import {
  ArgumentsHost,
  Catch,
  ExceptionFilter,
  HttpException,
} from '@nestjs/common';

@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {
  catch(exception: HttpException, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse();
    const request = ctx.getRequest();

    response.status(exception.getStatus()).json({
      statusCode: exception.getStatus(),
      path: request.url,
      timestamp: new Date().toISOString(),
      message: exception.message,
    });
  }
}

全局挂载:

ts
app.useGlobalFilters(new HttpExceptionFilter());

类比:

text
系统异常
  ↓
应急中心接警
  ↓
统一按标准格式回报
  ↓
前台/客户端看到一致错误结构

这比每个接口自己拼错误 JSON 稳定太多。

更重要的是,NestJS 内置很多 HTTP 异常:

  • BadRequestException
  • UnauthorizedException
  • ForbiddenException
  • NotFoundException
  • ConflictException

所以你应该优先抛语义明确的异常,而不是到处 throw new Error('出错了')