Программирование > Perl

Определние последовательности вызовов функций при ошибке

(1/2) > >>

sh:
В eval вызывается некотрый код состоящий из вызова множества функций, при возникновении ошибки в нем, хотелось бы узнать цепочку вызыванных функций до места ошибки.
caller насколько я понимаю дальше самого evala не показывает, а инетресно что там внутри вызывалось..

NeoNox:
use Date::Format qw/time2str/;

sub debug
{
                my $data = join(\'\', @_);

                my $fmt = \'\';
                my $ra = $ENV{"REMOTE_ADDR"};

                my $stack = tracestack();

                my $date = time2str("%m/%d %H:%M", time());
                $fmt = sprintf( "[%s PID%s] %s [@%s]\\n", $date, $$, $data, $stack );
               print $fmt;
}


sub tracestack
{
        # code and idea borrowed from CGI::Log 1.00
        # by Jason Moore, 1998 <jmoore@sober.com>
        my @call = caller(1);

        my $line = $call[2];
        my $fname = $call[1];
        my $cnt = 2;

        my @stack;

        while( defined($call[0]) )
        {
                my $oldcaller = $call[0];
                @call = caller($cnt);
                $call[3] = $oldcaller unless defined( $call[3] );
                $fname = $call[1] if defined $call[1];
                my $newcaller = $call[3];
                unless( $newcaller =~ s/^main/$fname($line)/ )
                {
                        $newcaller .= "($line)";
                }

                unshift(@stack, $newcaller);
                $line = $call[2]; $cnt++;
        }

        return (wantarray) ? @stack : $stack[-1];
}


Надеюсь, понятно будет.

sh:
показывает вызыв eval так, а то что внутри eval нету

NeoNox:
давайте конструкцию, дабы не гадать.

sh:
что-то вроде
sub a { тут код с ошибкой}
sub b{a();}

sub c {
eval " b();"
if ($@) { тут мне хочется узнать где именно произошла ошибка, в b или a}
}

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 
Перейти к полной версии