Как получить правильный номер строки, когда карп :: каркнул? - PullRequest
1 голос
/ 04 августа 2020

Есть ли правильный способ получить номер строки, в которой был вызван croak?

В следующем примере я попал в $stack:

  • строка 22, где последняя подпрограмма (l) была вызвана
  • строка 44, где try -блок завершается
  • все остальные вызовы в стеке

но я хочу знать строку 28, где я вызываю croak (или confess);

#!/usr/bin/env perl

{
  package Module;
  use strict; use warnings;
  use Carp qw(croak confess longmess);
  our @CARP_NOT = qw(Try::Tiny);
  use Try::Tiny;

  sub i {
    my ($x) = @_;
    j($x);
  }

  sub j {
    my ($x) = @_;
    k($x);
  }

  sub k {
    my ($x) = @_;
    l($x);
  }

  sub l {
    my ($x) = @_;
    my $stack = longmess();
    croak( { data => 1, stack => $stack } ) if $x =~ /\D/; # or confess
    return $x;
  }
  1;
}

use strict; use warnings; use 5.014;

import Module;
use Try::Tiny;
use Data::Dumper;

try {
  Module::i("x");
} catch {
  say Dumper $_;
};


Ответы [ 2 ]

2 голосов
/ 04 августа 2020
sub _lm { longmess() }

sub l {
  my ($x) = @_;
  die( { data => 1, stack => _lm() } ) if $x =~ /\D/;
  return $x;
}

или

sub l {
  my ($x) = @_;
  local $Carp::CarpLevel = $Carp::CarpLevel - 1;
  die( { data => 1, stack => longmess() } ) if $x =~ /\D/;
  return $x;
}

или

sub mycroak { die( { @_, stack => longmess() } ); }

sub l {
  my ($x) = @_;
  mycroak( data => 1 ) if $x =~ /\D/;
  return $x;
}

(croak заменено на die, потому что вы не воспользовались преимуществами croak функциональность.)

2 голосов
/ 04 августа 2020

Из раздела ОШИБКИ документации Carp :

В настоящее время процедуры Carp не обрабатывают объекты исключений. Если вызывается с первым аргументом, который является ссылкой, они просто вызывают d ie () или warn (), в зависимости от ситуации.

Если вы просто вызываете confess() без аргумента, строка номер будет сообщен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...