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

Peter Otten __peter__ at web.de
Tue Aug 21 16:53:04 EDT 2007


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



More information about the Python-list mailing list