annotate variant_effect_predictor/Bio/Root/Exception.pm @ 0:21066c0abaf5 draft

Uploaded
author willmclaren
date Fri, 03 Aug 2012 10:04:48 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1 #-----------------------------------------------------------------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2 # $Id: Exception.pm,v 1.14 2002/06/29 00:42:17 sac Exp $
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
3 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
4 # BioPerl module Bio::Root::Exception
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
5 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
6 # Cared for by Steve Chervitz <sac@bioperl.org>
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
7 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
8 # You may distribute this module under the same terms as perl itself
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
9 #-----------------------------------------------------------------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
10
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
11 =head1 NAME
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
12
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
13 Bio::Root::Exception - Generic exception objects for Bioperl
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
14
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
15 =head1 SYNOPSIS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
16
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
17 =head2 Throwing exceptions using B<Error::throw()>:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
18
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
19 use Bio::Root::Exception;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
20 use Error;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
21
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
22 # Set Error::Debug to include stack trace data in the error messages
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
23 $Error::Debug = 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
24
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
25 $file = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
26 open (IN, $file) ||
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
27 throw Bio::Root::FileOpenException ( "Can't open file $file for reading", $!);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
28
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
29 =head2 Throwing exceptions using B<Bio::Root::Root::throw()>:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
30
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
31 # Here we have an object that ISA Bio::Root::Root, so it inherits throw().
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
32
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
33 open (IN, $file) ||
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
34 $object->throw(-class => 'Bio::Root::FileOpenException',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
35 -text => "Can't open file $file for reading",
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
36 -value => $!);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
37
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
38 =head2 Catching and handling exceptions using B<Error::try()>:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
39
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
40 use Bio::Root::Exception;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
41 use Error qw(:try);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
42
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
43 # Note that we need to import the 'try' tag from Error.pm
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
44
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
45 # Set Error::Debug to include stack trace data in the error messages
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
46 $Error::Debug = 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
47
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
48 $file = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
49 try {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
50 open (IN, $file) ||
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
51 throw Bio::Root::FileOpenException ( "Can't open file $file for reading", $!);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
52 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
53 catch Bio::Root::FileOpenException with {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
54 my $err = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
55 print STDERR "Using default input file: $default_file\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
56 open (IN, $default_file) || die "Can't open $default_file";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
57 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
58 otherwise {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
59 my $err = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
60 print STDERR "An unexpected exception occurred: \n$err";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
61
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
62 # By placing an the error object reference within double quotes,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
63 # you're invoking its stringify() method.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
64 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
65 finally {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
66 # Any code that you want to execute regardless of whether or not
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
67 # an exception occurred.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
68 };
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
69 # the ending semicolon is essential!
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
70
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
71
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
72 =head2 Defining a new Exception type as a subclass of Bio::Root::Exception:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
73
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
74 @Bio::TestException::ISA = qw( Bio::Root::Exception );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
75
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
76
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
77 =head1 DESCRIPTION
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
78
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
79 =head2 Exceptions defined in B<Bio::Root::Exception>
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
80
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
81 These are generic exceptions for typical problem situations that could arise
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
82 in any module or script.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
83
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
84 =over 8
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
85
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
86 =item Bio::Root::Exception()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
87
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
88 =item Bio::Root::NotImplemented()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
89
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
90 =item Bio::Root::IOException()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
91
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
92 =item Bio::Root::FileOpenException()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
93
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
94 =item Bio::Root::SystemException()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
95
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
96 =item Bio::Root::BadParameter()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
97
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
98 =item Bio::Root::OutOfRange()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
99
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
100 =item Bio::Root::NoSuchThing()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
101
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
102 =back
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
103
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
104 Using defined exception classes like these is a good idea because it
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
105 indicates the basic nature of what went wrong in a convenient,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
106 computable way.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
107
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
108 If there is a type of exception that you want to throw
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
109 that is not covered by the classes listed above, it is easy to define
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
110 a new one that fits your needs. Just write a line like the following
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
111 in your module or script where you want to use it (or put it somewhere
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
112 that is accessible to your code):
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
113
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
114 @NoCanDoException::ISA = qw( Bio::Root::Exception );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
115
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
116 All of the exceptions defined in this module inherit from a common
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
117 base class exception, Bio::Root::Exception. This allows a user to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
118 write a handler for all Bioperl-derived exceptions as follows:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
119
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
120 use Bio::Whatever;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
121 use Error qw(:try);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
122
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
123 try {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
124 # some code that depends on Bioperl
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
125 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
126 catch Bio::Root::Exception with {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
127 my $err = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
128 print "A Bioperl exception occurred:\n$err\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
129 };
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
130
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
131 So if you do create your own exceptions, just be sure they inherit
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
132 from Bio::Root::Exception directly, or indirectly by inheriting from a
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
133 Bio::Root::Exception subclass.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
134
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
135 The exceptions in Bio::Root::Exception are extensions of Graham Barr's
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
136 B<Error.pm> module available from CPAN. Despite this dependency, the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
137 Bio::Root::Exception module does not explicitly C<require Error>.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
138 This permits Bio::Root::Exception to be loaded even when
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
139 Error.pm is not available.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
140
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
141 =head2 Throwing exceptions within Bioperl modules
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
142
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
143 Error.pm is not part of the Bioperl distibution, and may not be
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
144 present within any given perl installation. So, when you want to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
145 throw an exception in a Bioperl module, the safe way to throw it
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
146 is to use B<Bio::Root::Root::throw()> which can use Error.pm
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
147 when it's available. See documentation in Bio::Root::Root for details.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
148
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
149 =head1 SEE ALSO
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
150
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
151 See the C<examples/exceptions> directory of the Bioperl distribution for
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
152 working demo code.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
153
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
154 B<Bio::Root::Root::throw()> for information about throwing
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
155 Bio::Root::Exception-based exceptions.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
156
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
157 B<Error.pm> (available from CPAN, author: GBARR)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
158
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
159 Error.pm is helping to guide the design of exception handling in Perl 6.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
160 See these RFC's:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
161
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
162 http://dev.perl.org/rfc/63.pod
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
163
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
164 http://dev.perl.org/rfc/88.pod
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
165
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
166
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
167 =head1 AUTHOR
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
168
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
169 Steve Chervitz E<lt>sac@bioperl.orgE<gt>
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
170
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
171 =head1 COPYRIGHT
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
172
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
173 Copyright (c) 2001 Steve Chervitz. All Rights Reserved.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
174
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
175 This library is free software; you can redistribute it and/or modify
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
176 it under the same terms as Perl itself.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
177
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
178 =head1 DISCLAIMER
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
179
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
180 This software is provided "as is" without warranty of any kind.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
181
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
182 =head1 EXCEPTIONS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
183
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
184 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
185
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
186 # Define some generic exceptions.'
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
187
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
188 package Bio::Root::Exception;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
189
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
190 use strict;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
191
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
192 my $debug = $Error::Debug; # Prevents the "used only once" warning.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
193 my $DEFAULT_VALUE = "__DUMMY__"; # Permits eval{} based handlers to work
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
194
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
195 =head2 B<Bio::Root::Exception>
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
196
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
197 Purpose : A generic base class for all BioPerl exceptions.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
198 By including a "catch Bio::Root::Exception" block, you
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
199 should be able to trap all BioPerl exceptions.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
200 Example : throw Bio::Root::Exception("A generic exception", $!);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
201
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
202 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
203
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
204 #---------------------------------------------------------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
205 @Bio::Root::Exception::ISA = qw( Error );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
206 #---------------------------------------------------------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
207
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
208 =head2 Methods defined by Bio::Root::Exception
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
209
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
210 =over 4
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
211
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
212 =item B< new() >
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
213
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
214 Purpose : Guarantees that -value is set properly before
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
215 calling Error::new().
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
216
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
217 Arguments: key-value style arguments same as for Error::new()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
218
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
219 You can also specify plain arguments as ($message, $value)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
220 where $value is optional.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
221
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
222 -value, if defined, must be non-zero and not an empty string
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
223 in order for eval{}-based exception handlers to work.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
224 These require that if($@) evaluates to true, which will not
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
225 be the case if the Error has no value (Error overloads
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
226 numeric operations to the Error::value() method).
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
227
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
228 It is OK to create Bio::Root::Exception objects without
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
229 specifing -value. In this case, an invisible dummy value is used.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
230
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
231 If you happen to specify a -value of zero (0), it will
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
232 be replaced by the string "The number zero (0)".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
233
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
234 If you happen to specify a -value of empty string (""), it will
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
235 be replaced by the string "An empty string ("")".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
236
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
237 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
238
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
239 sub new {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
240 my ($class, @args) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
241 my ($value, %params);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
242 if( @args % 2 == 0 && $args[0] =~ /^-/) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
243 %params = @args;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
244 $value = $params{'-value'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
245 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
246 else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
247 $params{-text} = $args[0];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
248 $value = $args[1];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
249 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
250
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
251 if( defined $value and not $value) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
252 $value = "The number zero (0)" if $value == 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
253 $value = "An empty string (\"\")" if $value eq "";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
254 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
255 else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
256 $value ||= $DEFAULT_VALUE;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
257 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
258 $params{-value} = $value;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
259
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
260 my $self = $class->SUPER::new( %params );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
261 return $self;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
262 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
263
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
264 =item pretty_format()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
265
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
266 Purpose : Get a nicely formatted string containing information about the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
267 exception. Format is similar to that produced by
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
268 Bio::Root::Root::throw(), with the addition of the name of
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
269 the exception class in the EXCEPTION line and some other
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
270 data available via the Error object.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
271 Example : print $error->pretty_format;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
272
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
273 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
274
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
275 sub pretty_format {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
276 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
277 my $msg = $self->text;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
278 my $stack = '';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
279 if( $Error::Debug ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
280 $stack = $self->_reformat_stacktrace();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
281 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
282 my $value_string = $self->value ne $DEFAULT_VALUE ? "VALUE: ".$self->value."\n" : "";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
283 my $class = ref($self);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
284
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
285 my $title = "------------- EXCEPTION: $class -------------";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
286 my $footer = "\n" . '-' x CORE::length($title);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
287 my $out = "\n$title\n" .
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
288 "MSG: $msg\n". $value_string. $stack. $footer . "\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
289 return $out;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
290 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
291
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
292
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
293 # Reformatting of the stack performed by _reformat_stacktrace:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
294 # 1. Shift the file:line data in line i to line i+1.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
295 # 2. change xxx::__ANON__() to "try{} block"
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
296 # 3. skip the "require" and "Error::subs::try" stack entries (boring)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
297 # This means that the first line in the stack won't have any file:line data
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
298 # But this isn't a big issue since it's for a Bio::Root::-based method
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
299 # that doesn't vary from exception to exception.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
300
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
301 sub _reformat_stacktrace {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
302 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
303 my $msg = $self->text;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
304 my $stack = $self->stacktrace();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
305 $stack =~ s/\Q$msg//;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
306 my @stack = split( /\n/, $stack);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
307 my @new_stack = ();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
308 my ($method, $file, $linenum, $prev_file, $prev_linenum);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
309 my $stack_count = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
310 foreach my $i( 0..$#stack ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
311 # print "STACK-ORIG: $stack[$i]\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
312 if( ($stack[$i] =~ /^\s*([^(]+)\s*\(.*\) called at (\S+) line (\d+)/) ||
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
313 ($stack[$i] =~ /^\s*(require 0) called at (\S+) line (\d+)/)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
314 ($method, $file, $linenum) = ($1, $2, $3);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
315 $stack_count++;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
316 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
317 else{
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
318 next;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
319 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
320 if( $stack_count == 1 ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
321 push @new_stack, "STACK: $method";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
322 ($prev_file, $prev_linenum) = ($file, $linenum);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
323 next;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
324 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
325
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
326 if( $method =~ /__ANON__/ ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
327 $method = "try{} block";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
328 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
329 if( ($method =~ /^require/ and $file =~ /Error\.pm/ ) ||
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
330 ($method =~ /^Error::subs::try/ ) ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
331 last;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
332 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
333 push @new_stack, "STACK: $method $prev_file:$prev_linenum";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
334 ($prev_file, $prev_linenum) = ($file, $linenum);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
335 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
336 push @new_stack, "STACK: $prev_file:$prev_linenum";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
337
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
338 return join "\n", @new_stack;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
339 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
340
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
341 =item B< stringify() >
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
342
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
343 Purpose : Overrides Error::stringify() to call pretty_format().
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
344 This is called automatically when an exception object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
345 is placed between double quotes.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
346 Example : catch Bio::Root::Exception with {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
347 my $error = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
348 print "$error";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
349 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
350
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
351 See Also: L<pretty_format()|pretty_format>
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
352
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
353 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
354
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
355 sub stringify {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
356 my ($self, @args) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
357 return $self->pretty_format( @args );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
358 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
359
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
360
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
361
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
362 =back
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
363
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
364 =head1 Subclasses of Bio::Root::Exception
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
365
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
366
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
367 =head2 B<Bio::Root::NotImplemented>
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
368
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
369 Purpose : Indicates that a method has not been implemented.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
370 Example : throw Bio::Root::NotImplemented(
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
371 -text => "Method \"foo\" not implemented in module FooBar.",
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
372 -value => "foo" );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
373
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
374 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
375
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
376 #---------------------------------------------------------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
377 @Bio::Root::NotImplemented::ISA = qw( Bio::Root::Exception );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
378 #---------------------------------------------------------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
379
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
380 =head2 B<Bio::Root::IOException>
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
381
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
382 Purpose : Indicates that some input/output-related trouble has occurred.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
383 Example : throw Bio::Root::IOException(
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
384 -text => "Can't save data to file $file.",
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
385 -value => $! );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
386
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
387 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
388
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
389 #---------------------------------------------------------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
390 @Bio::Root::IOException::ISA = qw( Bio::Root::Exception );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
391 #---------------------------------------------------------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
392
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
393
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
394 =head2 B<Bio::Root::FileOpenException>
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
395
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
396 Purpose : Indicates that a file could not be opened.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
397 Example : throw Bio::Root::FileOpenException(
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
398 -text => "Can't open file $file for reading.",
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
399 -value => $! );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
400
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
401 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
402
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
403 #---------------------------------------------------------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
404 @Bio::Root::FileOpenException::ISA = qw( Bio::Root::IOException );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
405 #---------------------------------------------------------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
406
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
407
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
408 =head2 B<Bio::Root::SystemException>
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
409
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
410 Purpose : Indicates that a system call failed.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
411 Example : unlink($file) or throw Bio::Root::SystemException(
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
412 -text => "Can't unlink file $file.",
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
413 -value => $! );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
414
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
415 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
416
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
417 #---------------------------------------------------------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
418 @Bio::Root::SystemException::ISA = qw( Bio::Root::Exception );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
419 #---------------------------------------------------------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
420
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
421
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
422 =head2 B<Bio::Root::BadParameter>
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
423
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
424 Purpose : Indicates that one or more parameters supplied to a method
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
425 are invalid, unspecified, or conflicting.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
426 Example : throw Bio::Root::BadParameter(
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
427 -text => "Required parameter \"-foo\" was not specified",
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
428 -value => "-foo" );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
429
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
430 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
431
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
432 #---------------------------------------------------------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
433 @Bio::Root::BadParameter::ISA = qw( Bio::Root::Exception );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
434 #---------------------------------------------------------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
435
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
436
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
437 =head2 B<Bio::Root::OutOfRange>
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
438
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
439 Purpose : Indicates that a specified (start,end) range or
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
440 an index to an array is outside the permitted range.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
441 Example : throw Bio::Root::OutOfRange(
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
442 -text => "Start coordinate ($start) cannot be less than zero.",
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
443 -value => $start );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
444
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
445 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
446
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
447 #---------------------------------------------------------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
448 @Bio::Root::OutOfRange::ISA = qw( Bio::Root::Exception );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
449 #---------------------------------------------------------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
450
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
451
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
452 =head2 B<Bio::Root::NoSuchThing>
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
453
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
454 Purpose : Indicates that a requested thing cannot be located
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
455 and therefore could possibly be bogus.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
456 Example : throw Bio::Root::NoSuchThing(
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
457 -text => "Accession M000001 could not be found.",
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
458 -value => "M000001" );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
459
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
460 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
461
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
462 #---------------------------------------------------------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
463 @Bio::Root::NoSuchThing::ISA = qw( Bio::Root::Exception );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
464 #---------------------------------------------------------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
465
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
466
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
467 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
468