📖 Scenario: You are building a simple NestJS API that returns user data. You want to handle errors gracefully by using exception filters to catch and respond to errors in a clean way.
🎯 Goal: Create a custom exception filter in NestJS that catches HTTP exceptions and returns a JSON response with status code and error message.
📋 What You'll Learn
Create a custom exception filter class named HttpExceptionFilter
Use the ExceptionFilter interface and @Catch(HttpException) decorator
Implement the catch method to handle exceptions
Apply the exception filter globally in the main application bootstrap
💡 Why This Matters
🌍 Real World
Exception filters help APIs respond with clear error messages and status codes, improving user experience and debugging.
💼 Career
Understanding exception filters is essential for backend developers working with NestJS to build robust and maintainable APIs.
Progress0 / 4 steps
1
Create the custom exception filter class
Create a class called HttpExceptionFilter that implements ExceptionFilter and use the @Catch(HttpException) decorator.
NestJS
Hint
Use @Catch(HttpException) above the class and implement the ExceptionFilter interface.
2
Add a response object parameter to the catch method
Modify the catch method to accept a second parameter called host of type ArgumentsHost.
NestJS
Hint
Add host: ArgumentsHost as the second parameter to the catch method.
3
Implement the catch method to send JSON error response
Inside the catch method, get the response object from host.switchToHttp().getResponse(). Then get the status from exception.getStatus() and the message from exception.message. Use response.status(status).json({ statusCode: status, message: message }) to send the error response.
NestJS
Hint
Use host.switchToHttp().getResponse() to get the response object and send JSON with status and message.
4
Apply the exception filter globally in main.ts
In main.ts, import HttpExceptionFilter and use app.useGlobalFilters(new HttpExceptionFilter()) before calling app.listen().
NestJS
Hint
Call app.useGlobalFilters(new HttpExceptionFilter()) before app.listen().
Practice
(1/5)
1. What is the main purpose of an exception filter in NestJS?
easy
A. To catch and handle errors in a centralized way
B. To create database connections automatically
C. To define routes for HTTP requests
D. To manage user authentication
Solution
Step 1: Understand what exception filters do
Exception filters catch errors thrown during request handling and allow custom responses.
Step 2: Compare with other options
Options B, C, and D relate to other NestJS features, not error handling.
Final Answer:
To catch and handle errors in a centralized way -> Option A
C. Using exception.message instead of exception.getMessage()
D. Not importing HttpException class
Solution
Step 1: Check the @Catch() decorator usage
The @Catch(HttpException) references HttpException, but it is not imported from '@nestjs/common'.
Step 2: Validate other parts
catch method can omit return type and exception type in loose TS, exception.message is valid.
Final Answer:
Not importing HttpException class -> Option D
Quick Check:
Import HttpException for @Catch(HttpException) [OK]
Hint: Import exception classes used in @Catch() [OK]
Common Mistakes:
Not importing referenced exception types like HttpException
Assuming catch method needs strict return type
Thinking exception needs getMessage() method
5. You want to create a global exception filter that catches all exceptions and logs the error before sending a generic message. Which of these is the correct way to apply it globally in NestJS?
hard
A. Register the filter in a module's providers array only
B. Add @Global() decorator to the filter class
C. Use app.useGlobalFilters(new YourFilter()) in main.ts after creating the filter class
D. Call app.setGlobalExceptionFilter(YourFilter) in main.ts
Solution
Step 1: Recall how to apply global filters in NestJS
Global filters are applied using app.useGlobalFilters() method in the main bootstrap file.
Step 2: Evaluate other options
@Global() is for modules, not filters; registering in providers is local; app.setGlobalExceptionFilter() does not exist.
Final Answer:
Use app.useGlobalFilters(new YourFilter()) in main.ts after creating the filter class -> Option C
Quick Check:
Global filters use app.useGlobalFilters() [OK]
Hint: Global filters need app.useGlobalFilters() call [OK]
Common Mistakes:
Using @Global() decorator on filter class
Registering filter only in providers without global call
Assuming app.setGlobalExceptionFilter() exists
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.