Re-raising exceptions with modified message

Neil Cerutti horpner at yahoo.com
Fri Jul 6 12:58:36 CEST 2007


On 2007-07-06, Alex Popescu <the.mindstorm.mailinglist at gmail.com> wrote:
> On Jul 6, 4:20 am, Christoph Zwerschke <c... at online.de> wrote:
>> Alex Popescu wrote:
>> > Probably the simplest solution would be to create a new exception and
>> > wrapping the old one and the additional info. Unfortunately, this
>> > may have a huge impact on 3rd party code that was catching the
>> > original exception. So, I think you should create an utility
>> > factory-like function that is either creating a new exception
>> > instance as the one caught and with the additional information,
>>
>> Right, I have gone with that (see the example with the PoliteException
>> class somewhere below).
>>
>> > or an utility that knows how to modify the caught exception according
>> > to its type.
>>
>> I guess you mean something like this (simplified):
>>
>> except Exception, e:
>>      if getattr(e, 'reason'):
>>          e.reason += "sorry"
>>      else:
>>          e.message += "sorry"
>>
>> The problem is that these attribute names are not standardized and can
>> change between Python versions. Not even "args" is sure, and if a class
>> has "message" it does not mean that it is displayed. Therefore I think
>> the first approach is better.
>>
>> > In the first case you will need somehow to tell to the new instance
>> > exception the real stack trace, because by simply raising
>> > a new one the original stack trace may get lost.
>>
>> Yes, but thats a different problem that is easy to solve.
>
> Yeah maybe for a python guy, but I am a newbie. I would really
> appreciate if you can show in this thread how this can be done
> in Python.

Chech out the docs for sys.exc_info(), and for the raise
statement.

When handling an exception, you can rethrow a different
exception, but with the same traceback, by using the three-arg
version of raise.

See one of my earlier posts in this thread for a working example
(although it didn't solve Chris's problem).

-- 
Neil Cerutti



More information about the Python-list mailing list