[Bioperl-l] Bio::Root::RootI->throw($msg,$class) overloading?
Steve_Chervitz
Steve_Chervitz at affymetrix.com
Wed Jul 12 01:07:06 UTC 2006
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
More information about the Bioperl-l
mailing list