How to get outer class name from an inner class?
Terry Reedy
tjreedy at udel.edu
Tue May 8 18:11:51 EDT 2012
On 5/8/2012 4:05 PM, John Gordon wrote:
> I'm trying to come up with a scheme for organizing exceptions in
> my application.
>
> Currently, I'm using a base class which knows how to look up the text
> of a specific error in a database table, keyed on the error class name.
>
> The base class looks like this:
>
> class ApplicationException(Exception):
> """Base class for application-specific errors."""
>
> def get_message(self):
> """Return the error message associated with this class name."""
>
> class_name = self.__class__.__name__
> return UserMessage.objects.get(key=class_name).text
>
> And then I define a bunch of subclasses which all have different names:
>
> class QuestionTooShortError(NetIDAppsError):
> """User entered a security question which is too short."""
> pass
>
> class QuestionTooLongError(NetIDAppsError):
> """User entered a security question which is too long."""
> pass
>
> This scheme works, but I'd like to make it more streamlined. Specifically,
> I'd like to group the classes underneath a parent class, like so:
>
> class Question(ApplicationException):
>
> class TooShort(ApplicationException):
> pass
>
> class TooLong(ApplicationException):
> pass
>
> This will make it easier in the future for organizing lots of sub-errors.
I think maybe you are being much too fine-grained in your exception
hierarchy. Python has, for instance, just one ValueError, with details
in the error. The details can include specific values only known at the
point of the error. You are putting some specifics in the exception name
and then (apparently) given them somewhat redundant canned messages
lacking situation-specific details.
For instance
errfmt = "Security question length {:d} not in legal range {:d} - {:d}"
if not (secquemin <= len(secque) <= secquemax):
raise ValueError(errfmt.format(len(secque), secquemin, secquemax))
# or ApplicationError or AppValueError if you want.
The messages in Python are not this good, but they slowly improve as
people raises an issue on the tracker and others implement and apply fixex.
--
Terry Jan Reedy
More information about the Python-list
mailing list