6

Can't disable stack trace in Carp::croak() for some reasonと同じ問題があります。スタック内のすべての呼び出しは「安全」と見なされるため、毎回croak()完全なスタック トレースが出力されます。特定の通話では無効にしたいと思います。

次に例を示します。

use Carp;

sub this_may_fail {
  # Some code...
  croak "This call failed!";
}

sub regular_code {
  this_may_fail();
}

regular_code();

どちらのサブルーチンも同じパッケージに含まれているため、this_may_fail自動的に安全とマークされます。Carp にthis_may_fail安全でないと見なすべきことを伝える方法はありますか?

4

2 に答える 2

3

特にきれいではありませんが、これの代わりに:

sub regular_code {
   ...;
   my $result = this_may_fail(@args);
}

あなたはこれを使うことができます...

sub regular_code {
   ...;
   my $result = do {
      my $sub = \&this_may_fail;
      package DUMMY; $sub->(@args)
   };
}
于 2014-02-18T17:41:43.077 に答える
3

によってregular_code「安全」と見なされthis_may_failます。チェックは名前空間に基づいているため、安全でないようにするにthis_may_failは、別の名前空間に配置します。


または、独自の鳴き声を書きます。

perl -e'
   use Carp qw( );
   sub untrusting_croak {
      goto &Carp::croak if $Carp::Verbose;
      my @caller = caller(1);
      die(join("", @_)." at $caller[1] line $caller[2]\n");
   }

   sub f { untrusting_croak("!!!"); }    # Line 9

   f();                                  # Line 11
'
!!! at -e line 11
于 2014-02-18T17:18:54.770 に答える