[Bioperl-l] Bio::Root::RootI->throw($msg,$class) overloading?

Steve_Chervitz Steve_Chervitz at affymetrix.com
Wed Jul 12 18:53:22 UTC 2006


For modules that derive from Bio::Root::Root, there's no need to  
import Bio::Root::Exception since the Root object does it.

I also favor adding the -class parameter to throw_not_implemented in  
RootI. I just committed this change in in bioperl-live. I also added  
a test for it in t/RootI.t

I haven't run the complete suite of tests after making this change,  
but I don't suspect there'll be any trouble (famous last words).  
Really, if any test leads to the calling of throw_not_implemented  
(besides the test I just added), that in itself is trouble.

Steve

On Jul 11, 2006, at 8:27 PM, Chris Fields wrote:

> Makes sense to keep most of the magic in Root instead of RootI.pm.
> The POD for RootI does state that the class exception thrown is
> Bio::Root::NotImplemented, so we should probably either change the
> POD to reflect what really happens or change throw_not_implemented
> like you suggest (my vote is the latter).  I don't think many (if
> any) implementing classes fall into your 'trouble' category, though I
> can't be sure how many actually import Bio::Root::Exception.
>
> Chris
>
> On Jul 11, 2006, at 8:07 PM, Steve_Chervitz wrote:
>
>> On Jul 11, 2006, at 1:42 PM, Chris Fields wrote:
>>
>>> Bio::Root::Root doesn't overload throw_not_implemented from
>>> Bio::Root::RootI; from the comments looks like Steve C and Ewan B
>>> couldn't
>>> work out some of the Error.pm issues.
>>
>> The issue (I believe) was that
>> Bio::Root::RootI::throw_not_implemented was doing some checking for
>> the presence of Error.pm and calling Error::throw. I changed it so
>> that this fanciness only happens in Root.pm.
>>
>>> Judging by the POD for Bio::Root::RootI, throw_not_implemented
>>> doesn't
>>> accept arguments; it throws a Bio::Root::NotImplemented exception
>>> automatically.
>>
>> Looking at the code now, throw_not_implemented() does not throw a
>> Bio::Root::NotImplemented exception. It just throws a simple,
>> unclassed message. We could allow it to throw an exception of class
>> Bio::Root:NotImplemented by changing this code:
>>
>>     if( $self->can('throw') ) {
>> 	    $self->throw($message);
>>    }...
>>
>> to this
>>
>>     if( $self->can('throw') ) {
>> 	    $self->throw(-text=>$message, -
>> class=>'Bio::Root::NotImplemented');
>>    }...
>>
>> This does not create any dependency on Error.pm, but permits it to
>> be used if available. If Error.pm is not loaded, the only change is
>> that the class string is included in the error message, which is
>> kind of handy.
>>
>> Trouble would occur if the implementing class:
>>
>>  * does not derive from Bio::Root::Root,
>>  * does not import Bio::Root::Exception,
>>  * fails to implement a method which gets called, and
>>  * Error.pm is available.
>>
>> I don't know if such implementations exist in bioperl now, but I
>> suspect they would be rare (and discouraged).
>>
>> Steve
>>
>>
>>> Chris
>>>
>>>> -----Original Message-----
>>>> From: bioperl-l-bounces at lists.open-bio.org [mailto:bioperl-l-
>>>> bounces at lists.open-bio.org] On Behalf Of Rutger Vos
>>>> Sent: Tuesday, July 11, 2006 1:58 PM
>>>> To: Chris Fields
>>>> Cc: 'Bioperl List'
>>>> Subject: Re: [Bioperl-l] Bio::Root::RootI->throw($msg,$class)
>>>> overloading?
>>>>
>>>> I must have overlooked this. I think it does what I want. So
>>>> could I do
>>>> something like:
>>>>
>>>> $obj->thow_not_implemented( -class =>  
>>>> 'Bio::Root::NotImplemented' );
>>>>
>>>> ...in interfaces?
>>>>
>>>> Chris Fields wrote:
>>>>> I suppose you could; Bio::Root::Root does that using Error.pm
>>>>> (if it
>>>>> is installed).  It almost sounds like what Bio::Root::Root does is
>>>>> what you want, but you want a little more information when
>>>>> exceptions
>>>>> are thrown maybe?
>>>>>
>>>>> from perldoc Bio::Root::Root:
>>>>>
>>>>> ...
>>>>>           # Alternatively, using the new typed exception syntax in
>>>>> the throw() call:
>>>>>
>>>>>             $obj->throw( -class => 'Bio::Root::BadParameter',
>>>>>                          -text  => "Can not open file $file",
>>>>>                          -value  => $file);
>>>>> ...
>>>>>
>>>>>         Typed Exception Syntax
>>>>>
>>>>>         The typed exception syntax of throw() has the advantage of
>>>>> plainly
>>>>>         indicating the nature of the trouble, since the name of  
>>>>> the
>>>>> class is
>>>>>         included in the title of the exception output.
>>>>>
>>>>>         To take advantage of this capability, you must specify
>>>>> arguments as
>>>>>         named parameters in the throw() call. Here are the
>>>>> parameters:
>>>>>
>>>>>         -class
>>>>>             name of the class of the exception.  This should be  
>>>>> one
>>>>> of the
>>>>>             classes defined in Bio::Root::Exception, or a custom
>>>>> error of yours
>>>>>             that extends one of the exceptions defined in
>>>>> Bio::Root::Exception.
>>>>>
>>>>>         -text
>>>>>             a sensible message for the exception
>>>>>
>>>>>         -value
>>>>>             the value causing the exception or $!, if appropriate.
>>>>>
>>>>>         Note that Bio::Root::Exception does not need to be  
>>>>> imported
>>>>> into your
>>>>>         module (or script) namespace in order to throw
>>>>> exceptions via
>>>>>         Bio::Root::Root::throw(), since Bio::Root::Root imports  
>>>>> it.
>>>>>
>>>>>
>>>>> Chris
>>>>>
>>>>> On Jul 11, 2006, at 3:58 AM, Rutger Vos wrote:
>>>>>
>>>>>
>>>>>> Dear all,
>>>>>>
>>>>>> would it be possible to overload Bio::Root::RootI's 'throw'
>>>>>> method to
>>>>>> accept an additional, optional (positional) argument to define  
>>>>>> the
>>>>>> exception class, e.g. using Exception::Class:
>>>>>>
>>>>>> # ...somewhere ...
>>>>>>
>>>>>> sub makefh {
>>>>>>     my ( $self, $filename ) = @_;
>>>>>>     open my $fh, '<' $filename or $self->throw("Can't open
>>>>>> file: $!",
>>>>>> 'Bio::Exceptions::FileIO'); # NOTE second argument
>>>>>>     return $fh;
>>>>>> }
>>>>>>
>>>>>> #.... somewhere else
>>>>>> my $fh;
>>>>>> eval {
>>>>>>     $fh = $obj->makefh( 'data.txt');
>>>>>> }
>>>>>> if ( $@ and $@->isa('Bio::Exceptions::FileIO') ) {
>>>>>>     # something's wrong with the file?
>>>>>> }
>>>>>>
>>>>>> --
>>>>>> ++++++++++++++++++++++++++++++++++++++++++++++++++++
>>>>>> Rutger Vos, PhD. candidate
>>>>>> Department of Biological Sciences
>>>>>> Simon Fraser University
>>>>>> 8888 University Drive
>>>>>> Burnaby, BC, V5A1S6
>>>>>> Phone: 604-291-5625
>>>>>> Fax: 604-291-3496
>>>>>> Personal site: http://www.sfu.ca/~rvosa
>>>>>> FAB* lab: http://www.sfu.ca/~fabstar
>>>>>> Bio::Phylo: http://search.cpan.org/~rvosa/Bio-Phylo/
>>>>>> ++++++++++++++++++++++++++++++++++++++++++++++++++++
>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> Bioperl-l mailing list
>>>>>> Bioperl-l at lists.open-bio.org
>>>>>> http://lists.open-bio.org/mailman/listinfo/bioperl-l
>>>>>>
>>>>>
>>>>> Christopher Fields
>>>>> Postdoctoral Researcher
>>>>> Lab of Dr. Robert Switzer
>>>>> Dept of Biochemistry
>>>>> University of Illinois Urbana-Champaign
>>>>>
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> Bioperl-l mailing list
>>>>> Bioperl-l at lists.open-bio.org
>>>>> http://lists.open-bio.org/mailman/listinfo/bioperl-l
>>>>>
>>>>>
>>>>>
>>>>>
>>>>
>>>> --
>>>> ++++++++++++++++++++++++++++++++++++++++++++++++++++
>>>> Rutger Vos, PhD. candidate
>>>> Department of Biological Sciences
>>>> Simon Fraser University
>>>> 8888 University Drive
>>>> Burnaby, BC, V5A1S6
>>>> Phone: 604-291-5625
>>>> Fax: 604-291-3496
>>>> Personal site: http://www.sfu.ca/~rvosa
>>>> FAB* lab: http://www.sfu.ca/~fabstar
>>>> Bio::Phylo: http://search.cpan.org/~rvosa/Bio-Phylo/
>>>> ++++++++++++++++++++++++++++++++++++++++++++++++++++
>>>>
>>>>
>>>> _______________________________________________
>>>> Bioperl-l mailing list
>>>> Bioperl-l at lists.open-bio.org
>>>> http://lists.open-bio.org/mailman/listinfo/bioperl-l
>>>
>>> _______________________________________________
>>> Bioperl-l mailing list
>>> Bioperl-l at lists.open-bio.org
>>> http://lists.open-bio.org/mailman/listinfo/bioperl-l
>>
>
> Christopher Fields
> Postdoctoral Researcher
> Lab of Dr. Robert Switzer
> Dept of Biochemistry
> University of Illinois Urbana-Champaign
>
>
>
> _______________________________________________
> Bioperl-l mailing list
> Bioperl-l at lists.open-bio.org
> http://lists.open-bio.org/mailman/listinfo/bioperl-l




More information about the Bioperl-l mailing list