Skip to content

Commit d3fb439

Browse files
committed
docs: add exception handling section
1 parent bfbaad7 commit d3fb439

File tree

1 file changed

+43
-2
lines changed

1 file changed

+43
-2
lines changed

Diff for: docs/core/event_handler/api_gateway.md

+43-2
Original file line numberDiff line numberDiff line change
@@ -487,9 +487,10 @@ You can use **`not_found`** decorator to override this behaviour, and return a c
487487

488488
=== "app.py"
489489

490-
```python hl_lines="10 12 15" title="Handling not found"
490+
```python hl_lines="11 13 16" title="Handling not found"
491491
from aws_lambda_powertools import Logger, Tracer
492492
from aws_lambda_powertools.logging import correlation_paths
493+
from aws_lambda_powertools.event_handler import content_types
493494
from aws_lambda_powertools.event_handler.api_gateway import ApiGatewayResolver, Response
494495
from aws_lambda_powertools.event_handler.exceptions import NotFoundError
495496

@@ -514,7 +515,6 @@ You can use **`not_found`** decorator to override this behaviour, and return a c
514515
def catch_me_if_you_can():
515516
return {"message": "oh hey"}
516517

517-
# You can continue to use other utilities just as before
518518
@logger.inject_lambda_context(correlation_id_path=correlation_paths.API_GATEWAY_REST)
519519
@tracer.capture_lambda_handler
520520
def lambda_handler(event, context):
@@ -524,6 +524,47 @@ You can use **`not_found`** decorator to override this behaviour, and return a c
524524

525525
### Exception handling
526526

527+
You might want to handle an exception outside your route like custom validation errors or anything that warrants a different response (status code, headers, body).
528+
529+
You can use `exception_handler` decorator with any Python exception.
530+
531+
=== "app.py"
532+
533+
```python hl_lines="10 15" title="Exception handling"
534+
from aws_lambda_powertools import Logger, Tracer
535+
from aws_lambda_powertools.logging import correlation_paths
536+
from aws_lambda_powertools.event_handler import content_types
537+
from aws_lambda_powertools.event_handler.api_gateway import ApiGatewayResolver, Response
538+
539+
tracer = Tracer()
540+
logger = Logger()
541+
app = ApiGatewayResolver()
542+
543+
@app.exception_handler(ValueError)
544+
def handle_value_error(ex: ValueError):
545+
metadata = {"path": app.current_event.path}
546+
logger.error(f"Malformed request: {ex}", extra=metadata)
547+
548+
return Response(
549+
status_code=400,
550+
content_type=content_types.TEXT_PLAIN,
551+
body="Invalid request",
552+
)
553+
554+
555+
@app.get("/hello")
556+
@tracer.capture_method
557+
def hello_name():
558+
name = app.current_event.get_query_string_value(name="name")
559+
if name is not None:
560+
raise ValueError("name query string must be present")
561+
return {"message": f"hello {name}"}
562+
563+
@logger.inject_lambda_context(correlation_id_path=correlation_paths.API_GATEWAY_REST)
564+
@tracer.capture_lambda_handler
565+
def lambda_handler(event, context):
566+
return app.resolve(event, context)
567+
```
527568

528569

529570
### Raising HTTP errors

0 commit comments

Comments
 (0)