Start here. This is the direct spoken answer to practice first.
Overview
A global handler should normalize known failures without pretending every exception means the same thing.
I define a stable error shape with a machine-readable code, human-readable message, optional field details, and a correlation identifier. DRF's custom exception handler can normalize supported exceptions such as parse, validation, authentication, permission, throttling, and not-found failures. Application errors are translated at the API boundary. Unexpected exceptions return a generic 500 response while full details remain in protected logs.