📖 Scenario: You are building a NestJS backend service. You want to create a custom decorator that catches errors from a method and handles them gracefully.
🎯 Goal: Build a custom @CatchError decorator that wraps a method and catches any errors thrown, returning a friendly error message instead.
📋 What You'll Learn
Create a custom decorator function called CatchError
Use the decorator to wrap a method in a class
Catch any errors thrown inside the method
Return a string 'Error caught' when an error occurs
💡 Why This Matters
🌍 Real World
Custom decorators help add reusable behavior like error handling to methods in NestJS services, making code cleaner and more maintainable.
💼 Career
Understanding decorators is essential for backend developers working with NestJS, as they are widely used for middleware, validation, and error handling.
Progress0 / 4 steps
1
Create a simple service class with a method that throws an error
Create a class called TestService with a method dangerousMethod that throws an error with the message 'Something went wrong'.
NestJS
Hint
Define a class and inside it a method that throws an error using throw new Error('Something went wrong').
2
Create the CatchError decorator function
Create a function called CatchError that returns a method decorator function. The decorator should accept target, propertyKey, and descriptor parameters.
NestJS
Hint
Create a function that returns another function with the parameters target, propertyKey, and descriptor.
3
Implement error catching inside the decorator
Inside the CatchError decorator, save the original method from descriptor.value. Replace descriptor.value with a new function that calls the original method inside a try-catch block. If an error occurs, return the string 'Error caught'.
NestJS
Hint
Save the original method, then replace it with a function that uses try-catch to handle errors and return 'Error caught'.
4
Apply the @CatchError decorator to the method
Add the @CatchError() decorator above the dangerousMethod in the TestService class.
NestJS
Hint
Place @CatchError() directly above the method you want to decorate.
Practice
(1/5)
1. What is the primary purpose of the @Catch() decorator in NestJS?
easy
A. To mark a class as an exception filter that handles errors
B. To define a route handler for HTTP requests
C. To inject dependencies into a service
D. To create a middleware function
Solution
Step 1: Understand the role of @Catch()
The @Catch() decorator is used to mark a class as an exception filter in NestJS, which means it handles errors thrown in the application.
Step 2: Differentiate from other decorators
Other decorators like route handlers or dependency injections serve different purposes, so @Catch() specifically relates to error handling.
Final Answer:
To mark a class as an exception filter that handles errors -> Option A
Quick Check:
Error handling = @Catch() [OK]
Hint: Catch decorator marks error handlers in NestJS classes [OK]
Common Mistakes:
Confusing @Catch() with route or middleware decorators
Thinking @Catch() injects dependencies
Assuming @Catch() handles normal requests
2. Which of the following is the correct syntax to create an exception filter that catches all exceptions using the @Catch() decorator?
easy
A. @Catch()\nexport class AllExceptionsFilter implements ExceptionFilter { ... }
B. @Catch(Error)\nexport class AllExceptionsFilter implements ExceptionFilter { ... }
C. @Catch(HttpException)\nexport class AllExceptionsFilter implements ExceptionFilter { ... }
D. @Catch(Exception)\nexport class AllExceptionsFilter implements ExceptionFilter { ... }
Solution
Step 1: Understand @Catch() usage without parameters
Using @Catch() with no arguments means the filter will catch all exceptions.
Step 2: Check other options
Options A, C, and D specify particular exception types, so they do not catch all exceptions.
Final Answer:
@Catch()\nexport class AllExceptionsFilter implements ExceptionFilter { ... } -> Option A
Quick Check:
No argument = catch all exceptions [OK]
Hint: Empty @Catch() catches all exceptions [OK]
Common Mistakes:
Passing incorrect exception types to @Catch()
Using @Catch() with a non-error class
Confusing @Catch() with middleware syntax
3. Given the following exception filter code, what will be the output when a NotFoundException is thrown?
B. The exception parameter lacks a type annotation
C. The catch method should return a value
D. The @Catch() decorator must specify an exception type
Solution
Step 1: Check method signature
The catch method's first parameter exception should have a type annotation, typically unknown or any.
Step 2: Verify other parts
The @Catch() decorator can be empty to catch all exceptions, returning void is allowed, and response retrieval is correct.
Final Answer:
The exception parameter lacks a type annotation -> Option B
Quick Check:
Missing parameter type = The exception parameter lacks a type annotation [OK]
Hint: Always type the exception parameter in catch method [OK]
Common Mistakes:
Forgetting to type the exception parameter
Thinking @Catch() requires arguments
Expecting catch to return a value
5. You want to create a single exception filter that handles both BadRequestException and UnauthorizedException with different custom messages. Which is the correct way to use the @Catch() decorator to achieve this?
hard
A. @Catch()\nexport class MultiExceptionFilter implements ExceptionFilter { ... }
B. @Catch([BadRequestException, UnauthorizedException])\nexport class MultiExceptionFilter implements ExceptionFilter { ... }
C. @Catch(BadRequestException, UnauthorizedException)\nexport class MultiExceptionFilter implements ExceptionFilter { ... }
D. Create two separate filters each with @Catch() for one exception
Solution
Step 1: Understand how to catch multiple exceptions
The @Catch() decorator accepts multiple exception classes as separate arguments to catch them in one filter.
Step 2: Evaluate options
@Catch(BadRequestException, UnauthorizedException)\nexport class MultiExceptionFilter implements ExceptionFilter { ... } correctly passes multiple exceptions as separate arguments. @Catch([BadRequestException, UnauthorizedException])\nexport class MultiExceptionFilter implements ExceptionFilter { ... } incorrectly passes an array. @Catch()\nexport class MultiExceptionFilter implements ExceptionFilter { ... } catches all exceptions. Create two separate filters each with @Catch() for one exception uses multiple filters, not one.
Final Answer:
@Catch(BadRequestException, UnauthorizedException)\nexport class MultiExceptionFilter implements ExceptionFilter { ... } -> Option C
Quick Check:
Multiple exceptions as arguments = @Catch(BadRequestException, UnauthorizedException)\nexport class MultiExceptionFilter implements ExceptionFilter { ... } [OK]
Hint: Pass multiple exceptions as separate arguments to @Catch() [OK]
Common Mistakes:
Passing exceptions as an array to @Catch()
Using multiple filters instead of one
Using empty @Catch() to catch specific exceptions
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.