【问题标题】:Perl die with string without appending file name and line numberPerl 带有字符串而没有附加文件名和行号
【发布时间】:2018-04-30 05:55:09
【问题描述】:

在 Perl 中是否有一种dieing 的方式使得$@ 不会被修改?据我所知,die 在某些情况下会破坏$@ 的内容并“抛出”,将控制权转移到非本地。我只想做后者。

die 是字符串时,当传递给die 的异常对象是字符串(或undef)时,将文件名和行号附加到$@

例如,

#!/usr/bin/env perl
# foo.pl
use strict;
use warnings;
use Data::Dumper;

eval { die '1'; };
my $hash_ref = {
    msg => $@,
};

print Dumper($hash_ref);

打印:

$VAR1 = {
          'msg' => '1 at foo.pl line 7.
'
        };

但如果参数不是字符串(或 undef),则不会对其进行修改。

#!/usr/bin/env perl
# foo2.pl
use strict;
use warnings;
use Data::Dumper;

eval { die ['string-inside-arrayref']; };
my $hash_ref = {
    msg => $@,
};

print Dumper($hash_ref);

这个 sn-p 产生:

$VAR1 = {
          'msg' => [
                     'string-inside-arrayref'
                   ]
        };

【问题讨论】:

  • 您自己发出die 吗?要禁止行/文件信息,请添加换行符die "$string\n";。否则你可以为它设置一个钩子,$SIG{__DIE__} = sub { ...},并在里面随意格式化。见%SIG in perlvar

标签: perl


【解决方案1】:

perldoc -f die:

模具清单

die 引发异常。 [...]

如果 LIST 的最后一个元素不以换行符结尾,则还会打印当前脚本行号和输入行号(如果有),并提供换行符。

如果您想禁止添加文件名和行号,请​​确保您的错误消息以 "\n" 结尾。

要重新抛出现有异常,您只需使用die $@$@ 要么是一个异常对象(那么它无论如何都不会被破坏),要么是一个以 "\n" 结尾的字符串(因为之前的 die 将确保添加一个如果没有开始)。

【讨论】:

  • 这对于用户代码来说似乎很好,但我正在尝试编写一个库来捕获、检查并可能重新抛出异常。我希望能够准确地重新抛出我收到的异常,即使异常对象已在 XS 模块或类似的东西中设置为非换行符分隔的字符串。
猜你喜欢
  • 2017-12-14
  • 2019-03-01
  • 2016-11-19
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-27
  • 2018-08-22
相关资源
最近更新 更多