0

Why I stopped using try-catch everywhere (and what I do instead)

Early in my career, I wrapped everything in try-catch blocks. Every function, every API call, every database query. My code looked like a Russian nesting doll of exception handlers.

Then I realized: most of those try-catch blocks were hiding bugs, not handling errors.

The Problem

try:
    user = get_user(user_id)
        orders = get_orders(user.id)
            total = calculate_total(orders)
            except Exception:
                return None  # 🤡
                ```
                
                This catches *everything* — including typos, null references, and logic errors that should crash loudly. Returning `None` means the bug surfaces 3 layers up as a mysterious `NoneType has no attribute` error.
                
                ## What I Do Instead
                
                ### 1. Let it crash (in development)
                
                Unexpected errors should be loud. If `get_user` fails because of a bad query, I *want* to see the stack trace immediately — not a silent `None`.
                
                ### 2. Only catch what you can handle
                
                ```python
                try:
                    response = requests.get(url, timeout=5)
                    except requests.Timeout:
                        return cached_response  # I know what to do here
                        ```
                        
                        Catch specific exceptions. Have a concrete recovery plan. If you can't recover, don't catch.
                        
                        ### 3. Use Result types for expected failures
                        
                        ```python
                        def parse_config(path: str) -> Result[Config, str]:
                            if not path.exists():
                                    return Err("Config file not found")
                                        return Ok(Config.from_file(path))
                                        ```
                                        
                                        This makes failure an explicit part of the return type. Callers *must* handle both cases.
                                        
                                        ### 4. Fail at the boundary
                                        
                                        Put error handling at system boundaries — API endpoints, CLI entry points, message consumers. Let errors propagate naturally through your business logic.
                                        
                                        ```python
                                        @app.route('/api/orders')
                                        def get_orders():
                                            try:
                                                    return jsonify(order_service.list_orders())
                                                        except OrderServiceError as e:
                                                                return jsonify({"error": str(e)}), 400
                                                                ```
                                                                
                                                                ## The Rule
                                                                
                                                                **If your catch block is `pass`, `return None`, or `print(e)`, delete the try-catch.** You're not handling the error — you're hiding it.
                                                                
                                                                Better to crash with a clear stack trace than to silently corrupt data 3 hours into a production run.
                                                                
                                                                ---
                                                                
                                                                How do you handle errors in your projects? I'd love to hear different approaches.

All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.