Built-in exceptions, try/except/else/finally, custom exceptions, and chaining
Python exception handling is strongest when you catch specific built-in errors, use `else` for the success path, `finally` for cleanup, and custom exceptions when domain meaning matters.
- Catch only expected failures
- `else` runs when no exception occurred
- `raise ... from ...` preserves causal context
Built-in exceptions, try/except/else/finally, custom exceptions, and chaining