replacing built-in exception types

Stargaming stargaming at gmail.com
Fri Dec 14 12:17:53 EST 2007


On Tue, 11 Dec 2007 12:51:52 -0800, Nishkar Grover wrote:

> I'm trying to replace a built-in exception type and here's a simplified
> example of what I was hoping to do...
> 
> 
>  >>> import exceptions, __builtin__
>  >>>
>  >>> zeroDivisionError = exceptions.ZeroDivisionError

I don't know why you're fiddling that much with the names, 
`ZeroDivisionError` is a builtin name. If you do this to avoid 
overwriting the base classes, consider the following example::

   >>> class A(object): pass
   ...
   >>> class B(A): pass
   ...
   >>> A_backup = A
   >>> A_backup is A
   True
   >>> class A(object): pass
   ...
   >>> A_backup is A
   False
   >>> B.__base__ is A
   False
   >>> B.__base__ is A_backup
   True

The names really just point to an object. Once the resolution from a name 
to a real object is done, you can reuse the name.

>  >>> class Foo(zeroDivisionError):
> ...     bar = 'bar'
> ...
>  >>>
>  >>> exceptions.ZeroDivisionError = Foo
>  >>> ZeroDivisionError = Foo
>  >>> __builtin__.ZeroDivisionError = Foo
>  >>>
>  >>> try:
> ...     raise ZeroDivisionError
> ... except ZeroDivisionError, e:
> ...     print e.bar
> ...
> bar
>  >>>
>  >>> try:
> ...     1/0
> ... except ZeroDivisionError, e:
> ...     print e.bar
> ...
> Traceback (most recent call last):
>    File "<stdin>", line 2, in ?
> ZeroDivisionError: integer division or modulo by zero
>  >>>
>  >>>

The object that ZeroDivisionError points to in your code is *not* the 
raised exception.

> Notice that I get my customized exception type when I explicitly raise
> ZeroDivisionError but not when that is implicitly raised by 1/0. It
> seems like I have to replace that exception type at some lower level,
> but I'm not sure how/where. Does anyone know of a way to do this?

The obvious question is: What are you trying to do?

Remember that you can always catch an exception in an `except` clause and 
perform whatever action you want, eg. raise *another* exception.

If you just want to change error representations (I doubt that you really 
need it, tho), you might be interested in overwriting `sys.excepthook 
<http://docs.python.org/lib/module-sys.html#l2h-5125>`_.

HTH,



More information about the Python-list mailing list