Open2
【NestJS】例外処理・Exception Filters・エラーハンドリング周りの整理
登場人物
例外クラス
- Error
- JSで定義されているエラーの基底クラス
- HttpException
- Nestで定義されている例外クラス
- Errorを継承したもの
- 公式ドキュメント:https://docs.nestjs.com/exception-filters#throwing-standard-exceptions
- Built-in HTTP exceptions
- Nestで定義されている例外クラス
- HttpExceptionを継承したもの
- 公式ドキュメント:https://docs.nestjs.com/exception-filters#built-in-http-exceptions
Filter
- ExceptionFilter
- 例外フィルターのインターフェース
- 公式ドキュメント:https://docs.nestjs.com/exception-filters#exception-filters-1
- BaseExceptionFilter
- デフォルトでNestに適用されているグローバルフィルター
- ExceptionFilterを実装したもの
-
throw new Error()
したときに、ここでキャッチして500レスポンスを返している - 公式ドキュメント:https://docs.nestjs.com/exception-filters#inheritance
エラーを発生させたときの挙動
デフォルトはBaseExceptionFilter
でエラーが処理されるので、BaseExceptionFilter
の挙動ともいえる。
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
- 引数で渡したステータスコードを返す
- レスポンスの形式は引数で渡したもので自由に設定できる
- エラーログは出力されない