[Python-ideas] Consistent programming error handling idiom
Steven D'Aprano
steve at pearwood.info
Sun Apr 10 12:39:24 EDT 2016
On Sun, Apr 10, 2016 at 05:38:41PM +1200, Greg Ewing wrote:
> Rian Hunter wrote:
> >I want a consistent opt-in idiom with community consensus. I want a
> >clear way to express that an exception is an error and not an internal
> >bug.
>
> There's already a convention for this. Exceptions derived
> from EnvironmentError (OSError in python 3) usually
> result from something the user did wrong. Anything else that
> escapes lower-level exception handling is probably a bug.
I don't think this is a valid description of EnvironmentError. I don't
think you can legitimately say it "usually" comes from user error.
Let's say I have an application which, on startup, looks for config
files in various places. If they exist and are readable, the application
uses them. If they don't exist or aren't readable, an EnvironmentError
will be generated (say, IOError). This isn't a user error, and my app
can and should just ignore such missing config files.
Then the application goes to open a user-specified data file. If the
file doesn't exist, or can't be read, that will generate an
EnvironmentError, but it isn't one that should be logged. (Who wants to
log every time the user mispells a file name, or tries to open a file
they don't have permission for?)
In an interactive application, the app should display an error message
and then wait for more commands. In a batch or command-line app, the
application should exit. So treatment of the error depends on *what sort
of application* you have, not just the error itself.
Then the application phones home, looking for updates to download,
uploading the popularity statistics of the most commonly
used commands, bug reports, etc. What if it can't contact the home
server? That's most likely an EnvironmentError too, but it's not a
user-error.
Oops, I spelled the URL of my server "http://myserver.com.ua" instead of
.au. So that specific EnvironmentError is a programming bug. (No wonder
I haven't had any popularity stats uploaded...)
So EnvironmentError can represent any of:
- situation normal, not actually an error at all;
- a non-fatal user-error;
- a fatal user-error;
- transient network errors that will go away on their own;
- programming bugs.
> It's not perfect, but it works well enough most of the time.
> If I find a case where some non-bug exception gets raised that
> doesn't derive from EnvironmentError, I fix things so that
> it gets caught somewhere lower down and re-raised as an
> EnvironmentError.
That's ... rather strange. As in:
EnvironmentError("substring not found")
for an unsuccessful search?
--
Steve
More information about the Python-ideas
mailing list