6 nestjs 异常处理

在这里插入图片描述
在 NestJS 中,异常处理是构建健壮、可维护的应用程序的关键部分。NestJS 提供了一些内置的异常处理机制,同时也允许你自定义异常处理逻辑。以下是 NestJS 中异常处理的详细讲解及示例。

NestJS 中的异常处理机制

内置异常类:

NestJS 提供了一些内置的异常类,这些类位于 @nestjs/common 包中。这些异常类可以直接用来处理不同类型的错误,例如:

  • HttpException:基础异常类,其他 HTTP 异常类都继承自它。
  • NotFoundException:用于表示资源未找到的错误。
  • BadRequestException:用于表示请求无效或参数错误。
  • UnauthorizedException:用于表示未经授权的访问尝试。
  • ForbiddenException:用于表示禁止访问的错误。
  • InternalServerErrorException:用于表示服务器内部错误。

异常过滤器:

NestJS 允许你创建自定义的异常过滤器,这些过滤器可以处理应用程序中的所有异常。异常过滤器是实现 ExceptionFilter 接口的类,使用 @Catch() 装饰器来标记。

全局异常过滤器:

你可以将异常过滤器注册为全局过滤器,使其处理整个应用程序中的所有异常。

异常处理管道:

管道可以用于在请求处理之前对输入进行验证和转换。验证管道会抛出 BadRequestException,当输入验证失败时。

示例

以下是一个关于如何在 NestJS 中进行异常处理的详细示例,包括使用内置异常类、创建自定义异常过滤器以及注册全局异常过滤器。

// cats.controller.ts
import { Controller, Get, Param, NotFoundException, BadRequestException } from '@nestjs/common';

@Controller('cats')
export class CatsController {
  @Get(':id')
  findOne(@Param('id') id: string) {
    if (isNaN(Number(id))) {
      throw new BadRequestException('Invalid ID format');
    }
    
	if (Number(id) === 0) {
      throw new HttpException('Not Found', HttpStatus.NOT_FOUND);
    }

    const cat = this.findCatById(id); // 假设这是一个方法,用于查找猫的信息
    if (!cat) {
      throw new NotFoundException('Cat not found');
    }

    return cat;
  }

  private findCatById(id: string) {
    // 假设这里有查找猫的逻辑
    return null; // 示例中返回 null 以触发 NotFoundException
  }
}

常用的 HttpException

在 NestJS 中,HttpException 是用于处理 HTTP 异常的核心类。你可以使用它来创建自定义的异常响应。HttpException 的构造函数接受两个主要参数:

  • response(响应内容):这是可以返回给客户端的任意数据类型,通常是一个字符串或对象。它可以是错误消息、错误对象或其他信息。

  • status(状态码):这是 HTTP 响应的状态码,指定了错误的类型或状态。

new HttpException(response: string | object | any, status: number);

参数详解

response:

  • 类型: string | object | any
  • 说明: 这个参数是你希望发送给客户端的错误信息或数据。
    • 如果是字符串,通常是错误消息。
    • 如果是对象,你可以自定义更复杂的错误信息,比如包括错误码、详细描述等。

示例:

// 使用字符串作为响应内容
new HttpException('Not Found', HttpStatus.NOT_FOUND);

// 使用对象作为响应内容
new HttpException({
  statusCode: HttpStatus.NOT_FOUND,
  message: 'Resource not found',
  error: 'Not Found'
}, HttpStatus.NOT_FOUND);

status:

  • 类型: number
  • 说明: 这是 HTTP 响应的状态码,表示异常的类型。可以是 HTTP 标准状态码,如 404 (Not Found)、500 (Internal Server Error) 等。

示例:

// 创建 404 Not Found 异常
new HttpException('Not Found', HttpStatus.NOT_FOUND);

// 创建 400 Bad Request 异常
new HttpException('Bad Request', HttpStatus.BAD_REQUEST);

自定义

自定义异常类通常是继承自 HttpException 的类。这允许你创建具有特定错误信息和状态码的异常。

// custom-exception.ts
import { HttpException, HttpStatus } from '@nestjs/common';

export class CustomNotFoundException extends HttpException {
  constructor(message: string) {
    super(message, HttpStatus.NOT_FOUND);
  }
}

在这个例子中,CustomNotFoundException 类继承自 HttpException,并使用 HttpStatus.NOT_FOUND 作为默认状态码。

使用自定义异常类

在你的控制器或服务中,你可以抛出自定义异常类,以触发自定义的异常过滤器处理逻辑。

// cats.controller.ts
import { Controller, Get, Param } from '@nestjs/common';
import { CustomNotFoundException } from './custom-exception';

@Controller('cats')
export class CatsController {
  @Get(':id')
  findOne(@Param('id') id: string) {
    if (id === 'not-found') {
      throw new CustomNotFoundException('Cat not found with the provided ID');
    }
    
    // 其他逻辑...
    return { id };
  }
}
  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

史一试

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值