Try-except, custom exceptions, context managers, and logging
Catch errors gracefully instead of crashing. try-except, else, finally, and patterns for writing code that handles the unexpected.
Build your own exception classes when built-in errors aren't specific enough. Error hierarchies, context, and clean API design.
The with statement and resource cleanup done right. Build your own context managers using classes or contextlib.
Replace print() debugging with proper logging — log levels, formatters, handlers, and output you can actually search through.