[Bioperl-l] Grrrr. Another subtle overloading bug ...
Chervitz, Steve
Steve_Chervitz@affymetrix.com
Mon, 7 Jan 2002 13:01:51 -0800
Folks,
Apologies for causing trouble. So much for my attempt at transparency!
I've just checked in a fix to Bio::Root::Root::throw() that will ensure
backward compatibility for eval{}-based exception handling.
When I made changes in Root::throw(), I also added a variety of examples in
examples/exceptions that demonstrated the new functionality and tested for
backward compatibility (specifically, test2.pl and test4.pl in that dir).
They were all working, or so I thought.
I agree with Hilmar's comments re: exceptions. My aim was to be completely
transparent with the current exception throwing/handling methodology, yet to
enable users to get fancier if they want to, and have a standard way to get
fancy, instead of creating multiple, incompatible Bioperl extensions. I
realize this goal can be difficult to achieve. If the current system doesn't
cut it, I'm OK with reverting back to the old ways.
It would be nice if Error::throw() could be used within an eval{} block so
that the traditional if($@) syntax would work with Error objects. This will
take some digging into Error.pm to see what's going on here.
In the meantime, eval{}-based exception handling should be working again
after you cvs update. My examples/exceptions/test2.pl and test4.pl should
suffice as backward compatibility tests. Feel free to add to them as you
see fit. Sorry again for my lapse in testing.
Steve
> -----Original Message-----
> From: Ewan Birney [mailto:birney@ebi.ac.uk]
> Sent: Sunday, January 06, 2002 10:39 AM
> To: bioperl-l@bioperl.org
> Subject: [Bioperl-l] Grrrr. Another subtle overloading bug ...
>
>
>
>
> SteveC - you are going to get awards for introducing the most
> bizarre bugs
> across bioperl namespaces if we are not careful....
>
>
> The new Exception class SteveC checked in (at my behest to get things
> checked in early) now throws objects not scalars...
>
>
> These objects have a stringify method which evaluates to the expected
> string when printed - quite right
>
>
> ... but there is a *VERY* nasty side-effect ....
>
>
> which is that scenarios like
>
>
> eval {
> # do complex stuff
> # which might throw an exception
> };
>
> if( $@ ) { # you would expect this to evaluate to "true" on
> exception
> # do something else, like return failure gracefully
> } else {
> # do something sanely
> }
>
>
> This construct WONT work. <sigh>
>
> The reason is that
>
> if( $@ ) triggers the "stringify" method, which gives back
> a nice piece
> of text and then gets evaluated as a number (I think...),
> which goes to 0
> which evaluates as .... FALSE.
>
>
> ...Grrrrr...
>
>
> I suspect world wide we have lots of
>
> if( $@ ) {
>
> }
>
>
> (certainly there is alot in Ensembl...)
>
>
> Now ... I have commited some tests to fix this but then I
> realised that
> this is probably a bad idea and we need to fix things so that
>
>
> if( $@ ) {
> #
> }
>
> Evaluates to TRUE. SteveC - do you know how to do this. I have spent a
> fruitless half an hour in perl.com trying to find the overloading
> documentation.
>
>
>
> This is a nasty bug and something we have to get right. It
> also emphasises
> how important it is to test the 0.9 series before we call it
> 1.0 otherwise
> we will just trigger alot of bugs world-wide...
>
>
>
> ewan
>
>
> _______________________________________________
> Bioperl-l mailing list
> Bioperl-l@bioperl.org
> http://bioperl.org/mailman/listinfo/bioperl-l
>