首页 > 解决方案 > Carp::croaked时如何获得正确的行号?

问题描述

有没有正确的方法来获取croak被调用的行号?

在以下示例中,我进入$stack

但我想知道第 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 $_;
};


标签: perlexception

解决方案


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;
}

(替换croakdie因为您没有利用croak' 的任何功能。)


推荐阅读