annotate variant_effect_predictor/Bio/EnsEMBL/Utils/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 =head1 LICENSE
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
3 Copyright (c) 1999-2012 The European Bioinformatics Institute and
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
4 Genome Research Limited. All rights reserved.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
5
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
6 This software is distributed under a modified Apache license.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
7 For license details, please see
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
8
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
9 http://www.ensembl.org/info/about/code_licence.html
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
10
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
11 =head1 CONTACT
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
12
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
13 Please email comments or questions to the public Ensembl
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
14 developers list at <dev@ensembl.org>.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
15
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
16 Questions may also be sent to the Ensembl help desk at
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
17 <helpdesk@ensembl.org>.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
18
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
19 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
20
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
21 =head1 NAME
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
22
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
23 Bio::EnsEMBL::Utils::Exception - Utility functions for error handling
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
24
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
25 =head1 SYNOPSIS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
26
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
27 use Bio::EnsEMBL::Utils::Exception
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
28 qw(throw warning deprecate verbose try catch);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
29
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
30 or to get all methods just
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
31
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
32 use Bio::EnsEMBL::Utils::Exception;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
33
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
34 eval { throw("this is an exception with a stack trace") };
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
35 if ($@) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
36 print "Caught exception:\n$@";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
37 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
38
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
39 # Or you can us the try/catch confortable syntax instead to deal with
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
40 # throw or die. Don't forget the ";" after the catch block. With
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
41 # this syntax, the original $@ is in $_ in the catch subroutine.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
42
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
43 try {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
44 throw("this is an exception with a stack trace");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
45 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
46 catch { print "Caught exception:\n$_" };
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
47
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
48 # silence warnings
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
49 verbose('OFF');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
50
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
51 warning('this is a silent warning');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
52
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
53 #show deprecated and warning messages but not info
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
54 verbose('DEPRECATE');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
55
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
56 warning('this is a warning');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
57
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
58 # show all messages
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
59 verbose('ALL');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
60
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
61 info('this is an informational message');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
62
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
63 sub my_sub { deprecate('use other_sub() instead') }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
64
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
65 verbose('EXCEPTION');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
66 info( 'This is a high priority info message.', 1000 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
67
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
68 =head1 DESCRIPTION
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
69
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
70 This is derived from the Bio::Root module in BioPerl. Some formatting
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
71 has been changed and the deprecate function has been added. Most
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
72 notably the object methods are now static class methods that can be
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
73 called without inheriting from Bio::Root or Bio::EnsEMBL::Root. This is
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
74 especially useful for throwing exceptions with stack traces outside of a
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
75 blessed context.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
76
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
77 The originaly implementations of these methods were by Steve Chervitz
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
78 and refactored by Ewan Birney.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
79
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
80 It is recommended that these functions be used instead of inheriting
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
81 unnecessarily from the Bio::EnsEMBL::Root or Bio::Root object. The
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
82 functions exported by this package provide a set of useful error
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
83 handling methods.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
84
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
85 =head1 METHODS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
86
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
87 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
88
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
89 package Bio::EnsEMBL::Utils::Exception;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
90
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
91 use strict;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
92 use warnings;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
93
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
94 use Bio::EnsEMBL::ApiVersion;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
95
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
96 use Exporter;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
97
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
98 use vars qw(@ISA @EXPORT);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
99
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
100 @ISA = qw(Exporter);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
101 @EXPORT = qw(throw warning stack_trace_dump
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
102 stack_trace verbose deprecate info try catch);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
103
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
104 my $VERBOSITY = 3000;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
105 my $DEFAULT_INFO = 4000;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
106 my $DEFAULT_DEPRECATE = 3000;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
107 my $DEFAULT_WARNING = 2000;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
108 my $DEFAULT_EXCEPTION = 1000;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
109
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
110
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
111 =head2 throw
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
112
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
113 Arg [1] : string $msg
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
114 Arg [2] : (optional) int $level
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
115 override the default level of exception throwing
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
116 Example : use Bio::EnsEMBL::Utils::Exception qw(throw);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
117 throw('We have a problem');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
118 Description: Throws an exception which if not caught by an eval will
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
119 provide a stack trace to STDERR and die. If the verbosity level
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
120 is lower than the level of the throw, then no error message is
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
121 displayed but the program will still die (unless the exception
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
122 is caught).
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
123 Returntype : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
124 Exceptions : thrown every time
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
125 Caller : generally on error
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
126
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
127 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
128
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
129 sub throw {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
130 my $string = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
131
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
132 # For backwards compatibility with Bio::EnsEMBL::Root::throw: Allow
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
133 # to be called as an object method as well as class method. Root
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
134 # function now deprecated so call will have the string instead.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
135
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
136 $string = shift if ( ref($string) ); # Skip object if one provided.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
137 $string = shift if ( $string eq "Bio::EnsEMBL::Utils::Exception" );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
138
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
139 my $level = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
140 $level = $DEFAULT_EXCEPTION if ( !defined($level) );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
141
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
142 if ( $VERBOSITY < $level ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
143 die("\n"); # still die, but silently
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
144 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
145
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
146 my $std = stack_trace_dump(3);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
147
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
148 my $out = sprintf(
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
149 "\n" .
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
150 "-------------------- EXCEPTION --------------------\n" .
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
151 "MSG: %s\n" .
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
152 "%s" .
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
153 "Date (localtime) = %s\n" .
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
154 "Ensembl API version = %s\n" .
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
155 "---------------------------------------------------\n",
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
156 $string, $std, scalar( localtime() ), software_version() );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
157
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
158 die($out);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
159 } ## end sub throw
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
160
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
161
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
162
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
163 =head2 warning
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
164
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
165 Arg [1] : string warning(message);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
166 Arg [2] : (optional) int level
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
167 Override the default level of this warning changning the level
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
168 of verbosity at which it is displayed.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
169 Example : use Bio::EnsEMBL::Utils::Exception qw(warning)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
170 warning('This is a warning');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
171 Description: If the verbosity level is higher or equal to the level of this
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
172 warning then a warning message is printed to STDERR. If the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
173 verbosity lower then nothing is done. Under the default
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
174 levels of warning and verbosity warnings will be displayed.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
175 Returntype : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
176 Exceptions : warning every time
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
177 Caller : general
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
178
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
179 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
180
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
181 sub warning {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
182 my $string = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
183
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
184 # See throw() for this:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
185 $string = shift if ( ref($string) ); # Skip object if one provided.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
186 $string = shift if ( $string eq "Bio::EnsEMBL::Utils::Exception" );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
187
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
188 my $level = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
189 $level = $DEFAULT_WARNING if ( !defined($level) );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
190
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
191 return if ( $VERBOSITY < $level );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
192
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
193 my @caller = caller;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
194 my $line = $caller[2] || '';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
195
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
196 # Use only two sub-dirs for brevity when reporting the file name.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
197 my $file;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
198 my @path = split( /\//, $caller[1] );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
199 $file = pop(@path);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
200 my $i = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
201 while ( @path && $i < 2 ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
202 $i++;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
203 $file = pop(@path) . "/$file";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
204 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
205
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
206 @caller = caller(1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
207 my $caller_line;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
208 my $caller_file;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
209 $i = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
210 if (@caller) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
211 @path = split( /\//, $caller[1] );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
212 $caller_line = $caller[2];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
213 $caller_file = pop(@path);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
214 while ( @path && $i < 2 ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
215 $i++;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
216 $caller_file = pop(@path) . "/$caller_file";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
217 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
218 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
219
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
220 my $out =
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
221 sprintf( "\n" .
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
222 "-------------------- WARNING ----------------------\n" .
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
223 "MSG: %s\n" .
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
224 "FILE: %s LINE: %d\n",
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
225 $string, $file, $line );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
226
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
227 if ( defined($caller_file) ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
228 $out .= sprintf( "CALLED BY: %s LINE: %d\n", $caller_file,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
229 $caller_line );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
230 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
231 $out .= sprintf(
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
232 "Date (localtime) = %s\n" .
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
233 "Ensembl API version = %s\n" .
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
234 "---------------------------------------------------\n",
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
235 scalar( localtime() ), software_version() );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
236
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
237 warn($out);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
238
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
239 } ## end sub warning
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
240
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
241
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
242
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
243 =head2 info
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
244
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
245 Arg [1] : string $string
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
246 The message to be displayed
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
247 Arg [2] : (optional) int $level
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
248 Override the default level of this message so it is displayed at
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
249 a different level of verbosity than it normally would be.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
250 Example : use Bio::EnsEMBL::Utils::Exception qw(verbose info)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
251 Description: This prints an info message to STDERR if verbosity is higher
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
252 than the level of the message. By default info messages are not
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
253 displayed.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
254 Returntype : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
255 Exceptions : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
256 Caller : general
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
257
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
258 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
259
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
260 sub info {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
261 my $string = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
262 $string = shift if($string eq "Bio::EnsEMBL::Utils::Exception");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
263 my $level = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
264
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
265 $level = $DEFAULT_INFO if(!defined($level));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
266
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
267 return if($VERBOSITY < $level);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
268
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
269 print STDERR "INFO: $string\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
270 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
271
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
272
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
273
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
274 =head2 verbose
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
275
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
276 Arg [1] : (optional) int
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
277 Example : use Bio::EnsEMBL::Utils::Exception qw(verbose warning);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
278 #turn warnings and everything more important on (e.g. exception)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
279 verbose('WARNING');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
280 warning("Warning displayed");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
281 info("This won't be displayed");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
282 deprecate("This won't be diplayed");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
283
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
284 #turn exception messages on
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
285 verbose('EXCEPTION');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
286 warning("This won't do anything");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
287 throw("Die with a message");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
288
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
289 #turn everying off
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
290 verbose('OFF'); #same as verbose(0);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
291 warning("This won't do anything");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
292 throw("Die silently without a message");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
293
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
294 #turn on all messages
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
295 verbose('ALL');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
296 info("All messages are now displayed");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
297
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
298 if(verbose() > 3000) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
299 print "Verbosity is pretty high";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
300 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
301
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
302 Description: Gets/Sets verbosity level which defines which messages are
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
303 to be displayed. An integer value may be passed or one of the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
304 following strings:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
305 'OFF' (= 0)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
306 'EXCEPTION' (= 1000)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
307 'WARNING' (= 2000)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
308 'DEPRECATE' (= 3000)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
309 'INFO' (= 4000)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
310 'ALL' (= 1000000)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
311
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
312 Returntype : int
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
313 Exceptions : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
314 Caller : general
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
315
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
316 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
317
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
318
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
319 sub verbose {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
320 if(@_) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
321 my $verbosity = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
322 $verbosity = shift if($verbosity eq "Bio::EnsEMBL::Utils::Exception");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
323 if($verbosity =~ /\d+/) { #check if verbosity is an integer
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
324 $VERBOSITY = $verbosity;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
325 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
326 $verbosity = uc($verbosity);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
327 if($verbosity eq 'OFF' || $verbosity eq 'NOTHING' ||
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
328 $verbosity eq 'NONE') {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
329 $VERBOSITY = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
330 } elsif($verbosity eq 'EXCEPTION' || $verbosity eq 'THROW') {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
331 $VERBOSITY = $DEFAULT_EXCEPTION;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
332 } elsif($verbosity eq 'WARNING' || $verbosity eq 'WARN') {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
333 $VERBOSITY = $DEFAULT_WARNING;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
334 } elsif($verbosity eq 'DEPRECATE' || $verbosity eq 'DEPRECATED') {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
335 $VERBOSITY = $DEFAULT_DEPRECATE;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
336 } elsif($verbosity eq 'INFO') {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
337 $VERBOSITY = $DEFAULT_INFO;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
338 } elsif($verbosity eq 'ON' || $verbosity eq 'ALL') {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
339 $VERBOSITY = 1e6;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
340 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
341 $VERBOSITY = $DEFAULT_WARNING;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
342 warning("Unknown level of verbosity: $verbosity");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
343 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
344 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
345 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
346
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
347 return $VERBOSITY;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
348 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
349
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
350
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
351
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
352 =head2 stack_trace_dump
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
353
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
354 Arg [1] : (optional) int $levels
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
355 The number of levels to ignore from the top of the stack when
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
356 creating the dump. This is useful when this is called internally
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
357 from a warning or throw function when the immediate caller and
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
358 stack_trace_dump function calls are themselves uninteresting.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
359 Example : use Bio::EnsEMBL::Utils::Exception qw(stack_trace_dump);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
360 print STDERR stack_trace_dump();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
361 Description: Returns a stack trace formatted as a string
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
362 Returntype : string
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
363 Exceptions : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
364 Caller : general, throw, warning
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
365
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
366 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
367
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
368 sub stack_trace_dump{
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
369 my @stack = stack_trace();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
370
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
371 my $levels = 2; #default is 2 levels so stack_trace_dump call is not present
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
372 $levels = shift if(@_);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
373 $levels = shift if($levels eq "Bio::EnsEMBL::Utils::Exception");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
374 $levels = 1 if($levels < 1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
375
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
376 while($levels) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
377 $levels--;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
378 shift @stack;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
379 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
380
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
381 my $out;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
382 my ($module,$function,$file,$position);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
383
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
384
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
385 foreach my $stack ( @stack) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
386 ($module,$file,$position,$function) = @{$stack};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
387 $out .= "STACK $function $file:$position\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
388 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
389
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
390 return $out;
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
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
395 =head2 stack_trace
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
396
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
397 Arg [1] : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
398 Example : use Bio::EnsEMBL::Utils::Exception qw(stack_trace)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
399 Description: Gives an array to a reference of arrays with stack trace info
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
400 each coming from the caller(stack_number) call
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
401 Returntype : array of listrefs of strings
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
402 Exceptions : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
403 Caller : general, stack_trace_dump()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
404
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
405 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
406
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
407 sub stack_trace {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
408 my $i = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
409 my @out;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
410 my $prev;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
411 while ( my @call = caller($i++)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
412
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
413 # major annoyance that caller puts caller context as
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
414 # function name. Hence some monkeying around...
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
415 $prev->[3] = $call[3];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
416 push(@out,$prev);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
417 $prev = \@call;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
418 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
419 $prev->[3] = 'toplevel';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
420 push(@out,$prev);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
421 return @out;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
422 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
423
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
424
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
425 =head2 deprecate
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
426
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
427 Arg [1] : string $mesg
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
428 A message describing why a method is deprecated
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
429 Example : use Bio::EnsEMBL::Utils::Exception qw(deprecate)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
430 sub old_sub {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
431 deprecate('Please use new_sub() instead');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
432 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
433 Description: Prints a warning to STDERR that the method which called
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
434 deprecate() is deprecated. Also prints the line number and
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
435 file from which the deprecated method was called. Deprecated
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
436 warnings only appear once for each location the method was
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
437 called from. No message is displayed if the level of verbosity
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
438 is lower than the level of the warning.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
439 Returntype : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
440 Exceptions : warning every time
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
441 Caller : deprecated methods
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
442
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
443 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
444
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
445 my %DEPRECATED;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
446
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
447 sub deprecate {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
448 my $mesg = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
449 $mesg = shift if($mesg eq "Bio::EnsEMBL::Utils::Exception"); #skip object if one provided
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
450
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
451 my $level = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
452
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
453 $level = $DEFAULT_DEPRECATE if(!defined($level));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
454
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
455 return if($VERBOSITY < $level);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
456
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
457 my @caller = caller(1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
458 my $subname = $caller[3] ;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
459 my $line = $caller[2];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
460
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
461 #use only 2 subdirs for brevity when reporting the filename
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
462 my $file;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
463 my @path = $caller[1];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
464 $file = pop(@path);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
465 my $i = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
466 while(@path && $i < 2) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
467 $i++;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
468 $file .= pop(@path);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
469 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
470
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
471 #keep track of who called this method so that the warning is only displayed
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
472 #once per deprecated call
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
473 return if $DEPRECATED{"$line:$file:$subname"};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
474
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
475 if ( $VERBOSITY > -1 ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
476 print STDERR
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
477 "\n------------------ DEPRECATED ---------------------\n"
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
478 . "Deprecated method call in file $file line $line.\n"
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
479 . "Method $subname is deprecated.\n"
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
480 . "$mesg\n"
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
481 . "Ensembl API version = "
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
482 . software_version() . "\n"
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
483 . "---------------------------------------------------\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
484 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
485
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
486 $DEPRECATED{"$line:$file:$subname"} = 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
487 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
488
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
489 =head2 try/catch
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
490
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
491 Arg [1] : anonymous subroutine
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
492 the block to be tried
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
493 Arg [2] : return value of the catch function
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
494 Example : use Bio::EnsEMBL::Utils::Exception qw(throw try catch)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
495 The syntax is:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
496 try { block1 } catch { block2 };
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
497 { block1 } is the 1st argument
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
498 catch { block2 } is the 2nd argument
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
499 e.g.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
500 try {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
501 throw("this is an exception with a stack trace");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
502 } catch {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
503 print "Caught exception:\n$_";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
504 };
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
505 In block2, $_ is assigned the value of the first
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
506 throw or die statement executed in block 1.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
507
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
508 Description: Replaces the classical syntax
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
509 eval { block1 };
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
510 if ($@) { block2 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
511 by a more confortable one.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
512 In the try/catch syntax, the original $@ is in $_ in the catch subroutine.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
513 This try/catch implementation is a copy and paste from
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
514 "Programming Perl" 3rd Edition, July 2000, by L.Wall, T. Christiansen
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
515 & J. Orwant. p227, and is only possible because of subroutine prototypes.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
516 Returntype : depend on what is implemented the try or catch block
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
517 Exceptions : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
518 Caller : general
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
519
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
520 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
521
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
522 sub try (&$) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
523 my ($try, $catch) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
524 eval { &$try };
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
525 if ($@) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
526 chop $@;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
527 local $_ = $@;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
528 &$catch;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
529 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
530 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
531
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
532 sub catch (&) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
533 shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
534 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
535
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
536 1;