Forum Webscript.Ru

Программирование => Perl => Тема начата: sh от 27 Ноября 2007, 11:59:48

Название: Определние последовательности вызовов функций при ошибке
Отправлено: sh от 27 Ноября 2007, 11:59:48
В eval вызывается некотрый код состоящий из вызова множества функций, при возникновении ошибки в нем, хотелось бы узнать цепочку вызыванных функций до места ошибки.
caller насколько я понимаю дальше самого evala не показывает, а инетресно что там внутри вызывалось..
Название: Определние последовательности вызовов функций при ошибке
Отправлено: NeoNox от 27 Ноября 2007, 12:58:20
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
        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 от 27 Ноября 2007, 14:03:50
показывает вызыв eval так, а то что внутри eval нету
Название: Определние последовательности вызовов функций при ошибке
Отправлено: NeoNox от 27 Ноября 2007, 19:25:13
давайте конструкцию, дабы не гадать.
Название: Определние последовательности вызовов функций при ошибке
Отправлено: sh от 28 Ноября 2007, 14:42:25
что-то вроде
sub a { тут код с ошибкой}
sub b{a();}

sub c {
eval " b();"
if ($@) { тут мне хочется узнать где именно произошла ошибка, в b или a}
}
Название: Определние последовательности вызовов функций при ошибке
Отправлено: NeoNox от 28 Ноября 2007, 16:00:41
теперь понятно.

perldoc -f eval
...
Note that as a very special case, an eval \'\'  executed within the DB package doesn\'t see the usual surrounding lexical scope, but rather the scope of the first non-DB piece of code that called it. You don\'t normally need to worry about this unless you are writing a Perl debugger
Название: Определние последовательности вызовов функций при ошибке
Отправлено: sh от 29 Ноября 2007, 10:13:53
И что из этого следует, что посоветуете?