Bio-NEXUS
view release on metacpan or search on metacpan
lib/Bio/NEXUS/Util/Exceptions.pm view on Meta::CPAN
######################################################
# Exceptions.pm - Exception classes for Bio::NEXUS.
######################################################
# original version thanks to Rutger
#
# $Id: Exceptions.pm,v 1.5 2012/02/07 21:49:27 astoltzfus Exp $
#
package Bio::NEXUS::Util::StackTrace;
use strict;
sub new {
my $class = shift;
my $self = [];
my $i = 0;
my $j = 0;
package DB; # to get @_ stack from previous frames, see perldoc -f caller
while( my @frame = caller($i) ) {
my $package = $frame[0];
if ( not Bio::NEXUS::Util::StackTrace::_skip_me( $package ) ) {
my @args = @DB::args;
$self->[$j++] = [ @frame, @args ];
}
$i++;
}
package Bio::NEXUS::Util::StackTrace;
shift @$self; # to remove "throw" frame
return bless $self, $class;
}
sub _skip_me {
my $class = shift;
my $skip = 0;
if ( UNIVERSAL::isa( $class, 'Bio::NEXUS::Util::Exceptions') ) {
$skip++;
}
if ( UNIVERSAL::isa( $class, 'Bio::NEXUS::Util::ExceptionFactory' ) ) {
$skip++;
}
return $skip;
}
# fields in frame:
# [
# 0 'main',
# +1 '/Users/rvosa/Desktop/exceptions.pl',
# +2 102,
# +3 'Object::this_dies',
# 4 1,
# 5 undef,
# 6 undef,
# 7 undef,
# 8 2,
# 9 'UUUUUUUUUUUU',
# +10 bless( {}, 'Object' ),
# +11 'very',
# +12 'violently'
# ],
sub as_string {
my $self = shift;
my $string = "";
for my $frame ( @$self ) {
my $method = $frame->[3];
my @args;
for my $i ( 10 .. $#{ $frame } ) {
push @args, $frame->[$i];
}
my $file = $frame->[1];
my $line = $frame->[2];
no warnings 'uninitialized';
$string .= $method . "(" . join(', ', map { "'$_'" } @args ) . ") called at $file line $line\n";
}
return $string;
}
package Bio::NEXUS::Util::Exceptions;
BEGIN {
( run in 1.326 second using v1.01-cache-2.11-cpan-75ffa21a3d4 )