前回
例外フィルタ
例外フィルタは、Nest組み込みのレイヤーで、アプリケーション全体で未処理の例外を全て処理します。
アプリケーションコードによって例外が処理されない場合に、例外フィルタでキャッチされ、適切な応答が自動的に送信されます。
デフォルトでは、このアクションは組み込みのグローバル例外フィルタによって実行されます。
標準例外のスロー
Nestは、HttpExceptionクラスを提供します。
一般的なREST/GraphQL API ベースのアプリケーションでは、特定のエラー状態が発生した際に、標準のHTTP応答オブジェクトを送信することがベストプラクティスです。
標準例外をスローしてみましょう。
src/cats/cats.controller.ts
import { Controller, Get, HttpException, HttpStatus } from '@nestjs/common'; @Controller('cats') export class CatsController { @Get() findAll() { throw new HttpException('Forbidden', HttpStatus.FORBIDDEN) } }
postman
で、GET localhost:3000/cats
を呼び出すと、http status code が403 Forbidden
の状態で、以下が返却されます。
{ "statusCode": 403, "message": "Forbidden" }
HttpException
メソッドは、response
、status
、option
を引数にとります。
response
は、stringまたはobejctで、JSON応答の本文になります。
status
は、numberを引数にとり、HTTPステータスコードを指定します。
option
は、オプショナルです。エラーをスローする原因となった内部エラーに関する情報を提供します。
responseにオブジェクトを使用した版を作成してみましょう。
src/cats/cats.controller.ts
import { Controller, Get, HttpException, HttpStatus } from '@nestjs/common'; @Controller('cats') export class CatsController { @Get() findAll() { throw new HttpException( { status: HttpStatus.FORBIDDEN, error: 'error message...' }, HttpStatus.FORBIDDEN, { cause: new Error('cause...') } ); } }
postman
で、GET localhost:3000/cats
を呼び出すと、http status code が403 Forbidden
の状態で、以下が返却されます。
{ "status": 403, "error": "error message..." }
カスタム例外
多くの場合カスタム例外を作成する必要はないですが、もし仮に作成する必要がある場合は、以下のように作成します。
src/exception/custom.exception.ts
import { HttpException, HttpStatus } from "@nestjs/common"; export class CustomException extends HttpException { constructor() { super('custom', HttpStatus.FORBIDDEN); } }
src/cats/cats.controller.ts
import { Controller, Get, HttpException, HttpStatus } from '@nestjs/common'; import { CustomException } from 'src/exception/custom.exception'; @Controller('cats') export class CatsController { @Get() findAll() { throw new CustomException(); } }
postman
で、GET localhost:3000/cats
を呼び出すと、http status code が403 Forbidden
の状態で、以下が返却されます。
{ "statusCode": 403, "message": "custom" }
まとめ
ここまでで、
- 例外フィルタについて
- 標準例外のスローについて
- カスタム例外について
を学びました。
次回はもう少し例外フィルタについて掘り下げようと思います。
コード
今回のコードについては、以下に格納しました。