Proposed new dependency: github.com/juju/errors (and github.com/juju/errgo)

Jeroen Vermeulen jeroen.vermeulen at canonical.com
Fri May 30 16:24:22 UTC 2014


On 2014-05-30 15:08, roger peppe wrote:

>> Two: a caller can deal better with some errors, given more detailed
>> information.  You can help by attaching more information to the error (tags,
>> taxonomy, properties) but only on a best-effort basis.  You accept that you
>> don't know exactly which errors can come out of the code further down.
>
> This, on the other hand is interesting, and something I have not
> really considered. Thanks for bringing it up. I haven't written code like this,
> and I'm not aware of any in the juju-core code base.
>
> Have you got any real-world examples you could point to?

Usually it's mundane stuff.  I'm sure you're familiar with this and I 
just described in a way that made it harder to recognise!

Think of things like:

  * A broken-connection error can emerge from any of a number of places 
below this function call, but you've got a good way of handling them 
right after you come out of the call.  If you can't recognise the error 
for whatever reason, oh well, the user experience degrades a bit but you 
handle it as a generic program failure.

  * An IMAP client library annotates some kinds of errors with details 
about the command that failed.  It can't decide for you that you'll want 
those details in the error message, but you may still want to log them 
elsewhere.  You don't need that on a DNS lookup error, for example, so 
for that type of error you don't much care if you log the details or 
not.  It won't bother you if the library returns a different kind of 
error than before in some situations.

  * In some error situations a failed database transaction can be 
retried, and may well succeed next time.  This can save you a transient 
failure.  Of course it can be difficult to tell whether it's safe to do 
so.  Some types of database errors can say "retrying is safe as far as 
I'm concerned," but you default to failure.

  * You've been writing a file that could get quite large.  If you fail 
before you're done, you want to keep the data you have.  But if the 
error was "disk full," you prefer to clean up the output as a kindness 
to the user.

  * My systems management library calls a library called CoolApt to run 
the equivalent of apt-get update.  Your application uses my library.  It 
knows about the CoolApt "can't acquire packages lock" error and does a 
bit of investigating to provide a better explanation to the user.  When 
version 2.0 of my library replaces CoolApt with HotApt, you obviously 
want to upgrade.  The error is different, so this feature is temporarily 
broken — but you may find that acceptable.

These are all "quality of service" distinctions.  The effort of a more 
specific error is appreciated, but you can accept a certain amount of 
change.


Jeroen



More information about the Juju-dev mailing list