gpt4 book ai didi

perl - 由于某种原因,无法在 Carp::croak() 中禁用堆栈跟踪

转载 作者:行者123 更新时间:2023-12-03 16:00:01 26 4
gpt4 key购买 nike

根据 Carp 模块文档,croak()除非 $Carp::Verbose 否则不应产生任何堆栈跟踪评估为真。但出于某种原因,croak()总是表现得像 confess()在我的环境中,即总是打印堆栈跟踪,即使它不应该..

这是一个测试脚本:

#!/usr/bin/perl

use Modern::Perl;
use Carp;

sub func
{
say "Carp::Verbose = $Carp::Verbose";
croak "There should be no stack trace after this message!";
}

sub main
{
func();
}

main;

这是它在我的系统上产生的结果:
$ ./croak
Carp::Verbose = 0
There should be no stack trace after this message! at ./croak line 8
main::func() called at ./croak line 13
main::main() called at ./croak line 16

也许有人遇到过这个问题或对根本原因有任何线索?

以下是有关我的环境的一些信息:
Ubuntu 12.04 LTS
Linux 3.2.0-27-generic x86_64
perl 5, version 14, subversion 2 (v5.14.2) built for x86_64-linux-gnu-thread-multi

我在我的 SL6 系统上也遇到了同样的错误行为:
Scientific Linux SL release 6.3 (Carbon)
kernel-2.6.32-279.1.1.el6.x86_64
perl, v5.10.1 (*) built for x86_64-linux-thread-multi

最佳答案

Carp 之一用于错误消息的堆栈跟踪帧的规则是:

  1. Any call from a package to itself is safe.


由于您的代码不使用除 main 之外的任何包,并且由于另一条规则是 Carp包本身是安全的, Carp无法决定将哪一行代码用于其错误消息,因此它会踢出并打印出整个堆栈跟踪。

哦,它实际上在 Carp 中。 perldoc:

What they do is search the call-stack for a function call stack where thay have not been told that there shouldn't be an error. If every call is marked safe, they give up and give a full stack backtrace instead.


Carp::short_error_loc 中的这一行功能是你的确凿证据:
return 0 unless defined($caller);    # What happened?

关于perl - 由于某种原因,无法在 Carp::croak() 中禁用堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11879457/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com