You know the code. A function tries to do something, something goes wrong, and you see:
print ( f " Error: could not load config from { path } " ) sys . exit ( 1 )
Enter fullscreen mode
Exit fullscreen mode
Or this:
result = fetch_user ( user_id ) if result is None : return None profile = fetch_profile ( result . id ) if profile is None : return None ...
Enter fullscreen mode
Exit fullscreen mode
Or, in a slightly more sophisticated codebase, the function returns a tuple of (value, error) or a dict like {"ok": False, "error": "..."} and every caller has to remember to check it.
What these patterns share is that they're working hard to avoid using the feature the language built specifically for this situation: exceptions.
The avoidance is real
I don't have data, just years of reading other people's code. But the pattern is consistent: a lot of developers will reach for almost anything before raising an exception. They'll print and continue. They'll die or os.exit .…