Detecting an error condition and printing a usage message however is vastly nicer than expecting the user to dig through the code enough to understand why something blew up, possibly miles away from the actual error.
The "error" message then does two things, it provides run time documentation for unexpected states, and it subtly provides usage information during maintenance or casual reading of the code. As I said before, error handling and considering edge cases are the key to writing robust reliable code. The "consideration" part needs to be expressed in the code.
Optimising for fewest key strokes only makes sense transmitting to Pluto or beyond