Hiding tracebacks from end-users
kyosohma at gmail.com
kyosohma at gmail.com
Tue Oct 23 13:57:02 EDT 2007
On Oct 23, 11:07 am, Steven D'Aprano <st... at REMOVE-THIS-
cybersource.com.au> wrote:
> I'm writing a command-line application that is meant to be relatively
> user friendly to non-technical users.
>
> (Some wags might like to say that "user friendly" and "command-line
> application" are, by definition, contradictory. I disagree.)
>
> Consequently, I'd like to suppress Python's tracebacks if an error does
> occur, replacing it with a more friendly error message. I'm doing
> something like this:
>
> try:
> setup()
> do_something_useful()
> except KeyboardInterrupt:
> print >>sys.stderr, "User cancelled"
> sys.exit(2)
> except Exception, e:
> if expert_mode:
> # experts get the full traceback with no hand-holding.
> raise
> else:
> # print a more friendly error message
> if isinstance(e, AssertionError):
> msg = "An unexpected program state occurred"
> elif isinstance(e, urllib2.HTTPError):
> msg = "An Internet error occurred"
> else:
> # catch-all for any other exception
> msg = "An error occurred"
> print>>sys.stderr, msg
> print>>sys.stderr, e
> sys.exit(1)
> else:
> sys.exit(0)
>
> Is this a good approach? Is there another way to suppress the traceback
> and just print the error message?
>
> --
> Steven.
I think this is a good approach too. But why are you using If
statements for some errors? You should be able to do something like
this:
try:
do something
except AssertionError:
do something
except ZeroDivisionError:
do something
except urllib2.HTTPError:
do something
except...
etc, etc...
If you know what errors to expect, make them into a specific except
block. And leave the catchall on there for the exceptions you've
forgotten.
Mike
More information about the Python-list
mailing list