Open2

【NestJS】例外処理・Exception Filters・エラーハンドリング周りの整理

TKDTKD

登場人物

例外クラス

Filter

TKDTKD

エラーを発生させたときの挙動

デフォルトはBaseExceptionFilterでエラーが処理されるので、BaseExceptionFilterの挙動ともいえる。

https://github.com/nestjs/nest/blob/0e5efa575beb98f16bee5f05a32d3b6bc24d7407/packages/core/exceptions/base-exception-filter.ts

Errorを発生させた場合

throw new Error('test error');

レスポンス

{
    "statusCode": 500,
    "message": "Internal server error"
}

エラーログ

[Nest] 29439  - 2024/07/31 21:08:20   ERROR [ExceptionsHandler] test error
Error: test error
    at AppController.getHello (file://*****/src/app.controller.ts:10:11)

4xx系のHttpExceptionを発生させた場合

第一引数にstringを入れたとき

throw new HttpException('error message', HttpStatus.BAD_REQUEST);

レスポンス(messageに第一引数の値が入る)

{
    "statusCode": 400,
    "message": "error message"
}

エラーログは出力されない。

第一引数にobjectを入れたとき

throw new HttpException(
  {
    message: 'error message',
    additionalInfo: 'additional info',
    otherInfo: 'other info',
  },
  HttpStatus.BAD_REQUEST,
);

レスポンス(jsonが丸ごと置き換わる)

{
    "message": "error message",
    "additionalInfo": "additional info",
    "otherInfo": "other info"
}

エラーログは出力されない。

500のHttpExceptionを発生させた場合

throw new HttpException('error message', HttpStatus.INTERNAL_SERVER_ERROR);

レスポンス

{
    "statusCode": 500,
    "message": "error message"
}

エラーログは出力されない。

まとめると

  • Error
    • 500エラーを返す
    • レスポンスの形式は固定
    • エラーログを出力する
  • HttpException
    • 引数で渡したステータスコードを返す
    • レスポンスの形式は引数で渡したもので自由に設定できる
    • エラーログは出力されない