At 10:22 AM 9/16/2005 -0700, Alec Flett wrote:
In our case, I think heikki is saying that for end users, if we get an
exception at the top level, where developers would normally see a dialog
box with all sorts of ugly code, end-users should see a user-friendly
error message recommending the user quits & restarts chandler. Someday it
would be nice if the stack trace were sent back to OSAF to be combined
with others so we could see a "top exception" report and fix such errors.
Obviously, developers want the actual stack trace of the exception (an
assert being just one kind of exception) and the exception would NOT be
sent to a central talkback server, since developers are constantly
throwing exceptions during day-to-day debugging :)
Just as a side note, I've occasionally seen Chandler code that formats or
displays exception data, but does so from the start of the traceback
instead of the end. The start of the traceback info isn't helpful, since
it's going to be the same for all users.
I've also seen code that formats one exception and then re-raises it, which
destroys debugging information. In general, the best policy regarding
exceptions is not to catch them unless your code is actually handling the
exception. Let them bubble up to a top-level exception handler in the
application or in the testing framework. For example, consider this
snippet in TestLaunchChandler:
try:
Chandler.main()
didLaunch = True
# Catch exceptions that come all the way out, e.g. parcel.xml
issues.
except Exception, exception:
type, value, stack = sys.exc_info()
formattedBacktrace = "".join (traceback.format_exception
(type, value, stack, 5))
message = ("Chandler encountered an unexpected problem
which caused this unit test to fail.\n" + \
"Here are the bottom 5 frames of the
stack:\n%s") % formattedBacktrace
This extra code doesn't do anything useful, because the unittest module
will already format the traceback if an uncaught exception is raised. It
could be rewritten as:
Chandler.main()
and it would have the same effect, except you wouldn't be limited to 5
lines of formatting, and if you're using a test runner that supports
debug-on-error, you can drop into the debugger when the error occurs.
In general, this type of catch-and-reraise code is an antipattern for
exception handling in Python, even though it's understandably required for
sanity in "checked exception" languages like Java.
Outside of very high-level or very low-level code, try/except should be
avoided - *especially* "bare" excepts or "except Exception". Usually what
you want is either try/finally, or not to catch errors at all. The
"middlemen" in the stack usually don't know enough about the nature of the
error to handle it themselves, nor do they know enough about how the
application should report errors to the user.
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Open Source Applications Foundation "Dev" mailing list
http://lists.osafoundation.org/mailman/listinfo/dev