Suggesting the use of StandardError as base of error Exceptions.

A

Antoon Pardon

In a number of cases I have a program that looks like the following.

for case in all_cases:
try:
treat(case)
except Exception, ErrInfo:
generate_traceback()

The idea is to get as much information as possible when something
goes wrong but at the same time treat as many cases as possible.

Then one day things broke. The reason was that in some circumstances
treat would decide that things were beyond control and called sys.exit
However sys.exit doesn't return to the O.S. immediately but raises
SystemExit, which was caugth by the code and the loop continued.

I then took a look at http://docs.python.org/lib/module-exceptions.html
which describes the exception heirarchy as follows:

Exception
+-- SystemExit
+-- StopIteration
+-- StandardError
| +
| + All kind of error exceptions
| +
+---Warning
+
+ All kind of warnings
+

and came to the conclusion, that it would be better to write my code
as follows:

for case in all_cases:
try:
treat(case)
except StandardError, ErrInfo:
generate_traceback()

Unfortunatly this doesn't work either because a lot of the error
exceptions in the stdlib (if not all) inherit directly from
Exception instead of from StandardError. The documentation also
seems to suggest this use for users exception.

Now I was wondering if it wouldn't be better that for exception
that indicate some error condition that these would inherit
from StandardError and that this would be indicated in the
documentation and reflected in the stdlib?

Would it break much code to make this change? My first impression
would be no, but I could be missing something.
 
D

Diez B. Roggisch

Antoon said:
In a number of cases I have a program that looks like the following.

for case in all_cases:
try:
treat(case)
except Exception, ErrInfo:
generate_traceback()

The idea is to get as much information as possible when something
goes wrong but at the same time treat as many cases as possible.

Then one day things broke. The reason was that in some circumstances
treat would decide that things were beyond control and called sys.exit
However sys.exit doesn't return to the O.S. immediately but raises
SystemExit, which was caugth by the code and the loop continued.

I then took a look at http://docs.python.org/lib/module-exceptions.html
which describes the exception heirarchy as follows:

Exception
+-- SystemExit
+-- StopIteration
+-- StandardError
| +
| + All kind of error exceptions
| +
+---Warning
+
+ All kind of warnings
+

and came to the conclusion, that it would be better to write my code
as follows:

for case in all_cases:
try:
treat(case)
except StandardError, ErrInfo:
generate_traceback()

Unfortunatly this doesn't work either because a lot of the error
exceptions in the stdlib (if not all) inherit directly from
Exception instead of from StandardError. The documentation also
seems to suggest this use for users exception.

Now I was wondering if it wouldn't be better that for exception
that indicate some error condition that these would inherit
from StandardError and that this would be indicated in the
documentation and reflected in the stdlib?

Would it break much code to make this change? My first impression
would be no, but I could be missing something.

There has been a discussion on this just a few days ago, have you read that? There is even a PEP mentioned.

http://groups.google.com/group/comp...read/thread/56d7c5767a205866/d2403ae0c6267ca1


Diez
 
S

Steven Bethard

Antoon said:
I then took a look at http://docs.python.org/lib/module-exceptions.html
which describes the exception heirarchy as follows:

Exception
+-- SystemExit
+-- StopIteration
+-- StandardError
| +
| + All kind of error exceptions
| +
+---Warning
+
+ All kind of warnings
+

and came to the conclusion, that it would be better to write my code
as follows:

for case in all_cases:
try:
treat(case)
except StandardError, ErrInfo:
generate_traceback()

You've already been pointed to `PEP 352`_, but just to highlight the
salient point, I believe what you want to write is::

try:
...
except (KeyboardInterrupt, SystemExit):
raise
except:
...

... _PEP 352: http://www.python.org/peps/pep-0352.html

STeVe
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,483
Members
44,902
Latest member
Elena68X5

Latest Threads

Top