Best practise hierarchy for user-defined exceptions
clp at rebertia.com
Mon Nov 17 13:05:51 CET 2008
On Mon, Nov 17, 2008 at 3:47 AM, Slaunger <Slaunger at gmail.com> wrote:
> Hi there,
> I am a newcomer to Pyhton coming from Java working on a relatively
> large Pyhton project with several packages and modules. To improve
> exception handling I would like to introduce some user-defined
> exceptions to distinguish between exceptions raised in self-written
> code as compared to std libray modules used there-in.
> Say, for instance I would like to define a MyParseError exception to
> indicate that something has gone wrong while parsing a byte string, a
> file, or while packing into or unpacking from a struct.Struct
> Here is my stub-implemented idea on how to do it so far, which is
> inspired by how I would have done it in Java (but which may not be
> very Pythonic??):
> class MyException(Exception):
The above class probably isn't necessary. You don't need to
overgeneralize this much.
> class MyStandardError(MyException, StandardError):
Rename the previous class to just MyError in light of removing the other class.
> class MyParseError(MyStandardError, ValueError):
This technique is very Pythonic. Subclass from both the exception
class for your module and from a built-in one if there's an applicable
> Some comments and questions
> 1. The hierarchy is deliberately deep and maps to the std library such
> that it is easier to extend
Zen of Python: Flat is better than nested.
This is part of the reason I recommend removing the one class.
> 2. The implementations are empty but can be extended with hook for
> logging, statistics, etc.
True of stubs in general...
> 3. I use multiple inheritance in the two sub-classes. I have not tried
> that before. Is this A Good Thing or A Bad Thing to do?
Good in this case, just be careful to use super() if you override any methods.
> 4. Which __xx__ methods would you normally implement for the user-
> defined exception classes? I was thinking of __str__, for example? Is
> there a recommended __str__ idiom to use for that?
You might override __init__ if you want to store additional
information about the cause of the exception (e.g. location of parse
error, name of the rule the error occurred in, etc).
The __str__ inherited from Exception is usually sufficient, but you
can override it if you want to. it's a judgement call IMHO.
Follow the path of the Iguana...
> -- Slaunger
More information about the Python-list