Adjusting the names of custom exceptions (since raising strings is deprecated)

Silfheed silfheed at gmail.com
Tue Aug 21 18:16:42 EDT 2007


On Aug 21, 1:53 pm, Peter Otten <__pete... at web.de> wrote:
> Silfheed wrote:
> > On Aug 21, 1:32 am, James Stroud <jstr... at mbi.ucla.edu> wrote:
> >> Silfheed wrote:
> >> > Heyas
>
> >> > So this probably highlights my lack of understanding of how naming
> >> > works in python, but I'm currently using FailUnlessRaises in a unit
> >> > test and raising exceptions with a string exception.  It's working
> >> > pretty well, except that I get the deprecation warning that raising a
> >> > string exception is going to go away.  So my question is, how do I
> >> > mangle the name of my exception class enough that it doesnt stick the
> >> > name of the module before the name of the exception?
>
> >> > Namely I'd like to get the following
>
> >> > ***
> >> > Traceback (most recent call last):
> >> >   File "<stdin>", line 1, in ?
> >> > MyError: 'oops!'
>
> >> > instead of
>
> >> > ***
> >> > Traceback (most recent call last):
> >> >   File "<stdin>", line 1, in ?
> >> > __main__.MyError: 'oops!'
>
> >> > (or even test_thingie.MyError as is usually the case).
>
> >> > Creating a class in a separate file and then doing
>
> >> > ***
> >> > from module import MyError
> >> > raise MyError
>
> >> > still gives
>
> >> > ***
> >> > Traceback (most recent call last):
> >> >   File "<stdin>", line 1, in <module>
> >> > module.MyError
>
> >> > Anyway, any help appreciated.
>
> >> Would it be cheating to use metaclasses?
>
> >> # myModule.py
> >> class ExampleType(type):
> >>    def __repr__(cls):
> >>      return cls.__name__
>
> >> class ExampleError(Exception):
> >>    __metaclass__ = ExampleType
> >>    __name__ = 'ExampleError'
> >>    def __repr__(self):
> >>      return 'ExampleError'
>
> >> py> import myModule
> >> py> raise myMo
> >> myModule      myModule.py   myModule.pyc  myModule.py~
> >> py> raise myModule.Ex
> >> myModule.ExampleError  myModule.ExampleType
> >> py> raise myModule.ExampleError
> >> ------------------------------------------------------------
> >> Traceback (most recent call last):
> >>    File "<ipython console>", line 1, in <module>
> >> ExampleError
>
> >> James
>
> > It doesnt appear to work for me.
> > Same exact code as you have but I still get:
>
> >>>> raise myModule.ExampleError
> > Traceback (most recent call last):
> >   File "<stdin>", line 1, in <module>
> > myModule.ExampleError
>
> James tested his code in the ipython console which obviously uses a
> different routine to produce the traceback.
>
> Try
>
> >>> class MyError(Exception):
>
> ...     __module__ = None
> ...>>> raise MyError("oops")
>
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
> MyError: oops
>
> Peter

Ah ha! Thanks, that worked great!




More information about the Python-list mailing list