[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.python

Custom Exception Value?

erikcw

3/14/2008 6:47:00 PM

Hi,

When I use sys.exc_info() on one of my custom exception classes, the
"message"/value isn't returned. But it is when I use a built in
exception.

Example:

In [32]: class Test(Exception):
....: def __init__(self, x):
....: self.value = x
....: def __str__(self):
....: return repr(self.value)
....:
....:
In [39]: try:
....: raise Test('mess')
....: except:
....: sys.exc_info()
....:
....:
Out[39]: (<class '__main__.Test'>, Test(), <traceback object at
0xb7802e8c>)

In [40]: try:
....: 1/0
....: except:
....: sys.exc_info()
....:
....:
Out[40]:
(<type 'exceptions.ZeroDivisionError'>,
ZeroDivisionError('integer division or modulo by zero',),
<traceback object at 0xb78029dc>)


Wy does the output of ZeroDivisionError appear in sys.exc_info() but
for test it is just Test() (should be Test('mess') right??)

Thanks!
1 Answer

Arnaud Delobelle

3/14/2008 7:23:00 PM

0

On Mar 14, 6:47 pm, erikcw <erikwickst...@gmail.com> wrote:
> Hi,
>
> When I use sys.exc_info() on one of my custom exception classes, the
> "message"/value isn't returned.  But it is when I use a built in
> exception.
>
> Example:
>
> In [32]: class Test(Exception):
>    ....:     def __init__(self, x):
>    ....:         self.value = x
>    ....:     def __str__(self):
>    ....:         return repr(self.value)
>    ....:
>    ....:
> In [39]: try:
>    ....:     raise Test('mess')
>    ....: except:
>    ....:     sys.exc_info()
>    ....:
>    ....:
> Out[39]: (<class '__main__.Test'>, Test(), <traceback object at
> 0xb7802e8c>)
>
> In [40]: try:
>    ....:     1/0
>    ....: except:
>    ....:     sys.exc_info()
>    ....:
>    ....:
> Out[40]:
> (<type 'exceptions.ZeroDivisionError'>,
>  ZeroDivisionError('integer division or modulo by zero',),
>  <traceback object at 0xb78029dc>)
>
> Wy does the output of ZeroDivisionError appear in sys.exc_info() but
> for test it is just Test() (should be Test('mess') right??)

Three ways to do it right:

* Override __repr__() rather than __str__

or forget about __repr__() and instead:

* call super(Test, self).__init__(x) from within Test.__init__()

or even

* self self.args = (x,) within Test.__init__()

HTH

--
Arnaud