NestJSの例外処理の基本とカスタム例外を作成する方法

NestJSでの例外処理の基本と、カスタム例外の作成方法を学びましょう。

概要

NestJSでは、アプリケーション全体で未処理の例外を処理するための例外レイヤーが提供されています。この例外レイヤーを利用することで、未処理の例外が発生した場合でも適切なレスポンスを自動的に返すことができます。

NestJSのコントローラーは、クライアントからのHTTPリクエストを受け取り、適切なレスポンスを返す役割を果たします。この記事では、NestJSでコントローラーを作成し、GET、POST、PUT、DELETEなどのHTTPメソッドを処理する方法を詳しく解説します。

nest.js v10.1.7
nodejs v19.7.0

また、今回作成するコードは全て、GitHubに掲載しています。

例外をスローする方法

NestJSでは、HttpExceptionという名前のエラークラスがデフォルトで提供されています。このエラークラスは、@nestjs/commonパッケージからインポートできます。HttpExceptionをスローすることで、エラーが発生したことをNestJSに通知し、適切なエラーレスポンスを生成することができます。

以下に、HttpExceptionをスローするコントローラーの例を示します。

import {
  Controller,
  Get,
  Post,
  Put,
  Delete,
  Body,
  Param,
  HttpException,
  HttpStatus,
} from '@nestjs/common';
import { UsersService } from './users.service';

@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Get()
  getUsers(): User[] {
    return this.usersService.getUsers();
  }
  @Post()
  addUser(@Body() name: string): void {
    this.usersService.addUser(name);
  }
  @Put(':id')
  putUser(@Param('id') id: number, @Body('name') name: string): void {
    this.usersService.putUser(id, name);
  }
  @Delete(':id')
  deleteUser(@Param('id') id: number): void {
    this.usersService.deleteUser(id);
  }
  @Get('throw')
  getException(): string {
    throw new HttpException('Forbidden', HttpStatus.FORBIDDEN);
  }
}

上記のコードでは、/users/throwへのGETリクエストが来たときにHttpExceptionがスローされます。この例外は、ステータスコード403(Forbidden)とともに、‘Forbidden’というメッセージを持っています。

テスト

curl http://localhost:3000/users/throw

カスタム例外をスローする方法

NestJSでは、HttpExceptionを継承したカスタム例外を作成することも可能です。カスタム例外を作成することで、アプリケーション固有のエラー情報を持つ例外をスローすることができます。

以下に、カスタム例外の作成とスローの例を示します。

/src/users/exception/forbidden.exception.ts

import { HttpException, HttpStatus } from '@nestjs/common';

export class ForbiddenException extends HttpException {
  constructor() {
    super('Custom Forbidden', HttpStatus.FORBIDDEN);
  }
}

/src/users/users.controller.ts

import {
  Controller,
  Get,
  Post,
  Put,
  Delete,
  Body,
  Param,
  HttpException,
  HttpStatus,
} from '@nestjs/common';
import { UsersService } from './users.service';
import { ForbiddenException } from './exceptions/forbidden.exception';

@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Get()
  getUsers(): User[] {
    return this.usersService.getUsers();
  }

  @Post()
  addUser(@Body() name: string): void {
    this.usersService.addUser(name);
  }

  @Put(':id')
  putUser(@Param('id') id: number, @Body('name') name: string): void {
    this.usersService.putUser(id, name);
  }

  @Delete(':id')
  deleteUser(@Param('id') id: number): void {
    this.usersService.deleteUser(id);
  }
  @Get('throw')
  getException(): string {
    throw new HttpException('Forbidden', HttpStatus.FORBIDDEN);
  }
  @Get('custom_throw')
  getCustomException(): string {
    throw new ForbiddenException();
  }
}

上記のコードでは、ForbiddenExceptionというカスタム例外を作成し、/users/customへのGETリクエストが来たときにこの例外をスローしています。

テスト

curl http://localhost:3000/users/custom_throw

まとめ

NestJSでは、未処理の例外を自動的に処理する例外レイヤーが提供されています。また、HttpExceptionを利用することで、簡単に例外をスローすることができます。さらに、HttpExceptionを継承したカスタム例外を作成することで、アプリケーション固有のエラー情報を持つ例外をスローすることも可能です。これらの機能を活用することで、エラーハンドリングを効率的に行うことができます。