Автор Тема: Определние последовательности вызовов функций при ошибке  (Прочитано 6519 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн sh

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 4
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
В eval вызывается некотрый код состоящий из вызова множества функций, при возникновении ошибки в нем, хотелось бы узнать цепочку вызыванных функций до места ошибки.
caller насколько я понимаю дальше самого evala не показывает, а инетресно что там внутри вызывалось..

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
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];
}


Надеюсь, понятно будет.
The documentations is your friend

Оффлайн sh

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 4
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
показывает вызыв eval так, а то что внутри eval нету

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
давайте конструкцию, дабы не гадать.
The documentations is your friend

Оффлайн sh

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 4
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
что-то вроде
sub a { тут код с ошибкой}
sub b{a();}

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

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
теперь понятно.

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
The documentations is your friend

Оффлайн sh

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 4
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
И что из этого следует, что посоветуете?

 

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