我正在开发一个 Perl Tkx 应用程序,但无法获取有用/正确的错误消息。我正在尝试使用 croak,所以它会准确地告诉我失败的位置,但每次它发出 croak 时,它只会说错误位于“C:/Perl64/lib/Tkx.pm 第 347 行”。
我编写了一个非常简单的脚本来演示正在发生的事情:
#!/usr/bin/perl
use strict;
use warnings;
use Carp;
use Tkx;
my $mw = Tkx::widget->new(".");
my $b = $mw->new_button(
-text => "Hello, world",
-command => sub { croak; },
);
$b->g_pack;
Tkx::MainLoop();
当我运行此脚本并单击按钮时,我得到以下弹出框:
如何让 Tkx 处理类似于在常规 Perl 脚本中使用 croak 的错误?有没有办法强制呱呱打印到 STDOUT 或 STDERR?
编辑:
Michael Carman 提出了一个很好的观点,即通常使用 GUI 控制台将被抑制,用户永远不会看到发送到 STDOUT 或 STDERR 的错误,但是如何找到一种方法来修改“应用程序错误”对话框中的文本以说点有用的?那可能吗?
文本不一定对最终用户有用,但至少应该是程序员可以理解的,这样当最终用户报告问题时,他们知道在哪里寻找问题。
编辑2:
好的,似乎使用die
orconfess
代替croak
会向“应用程序错误”窗口打印更有用的错误消息,但是一旦我单击“确定”,程序就会继续运行并且实际上并没有死。我怎样才能“杀死它直到它死去”并确保它保持死亡状态?
可能的解决方案:
这是基于迈克尔·卡曼(Michael Carman)的回应的可能解决方案。我稍微修改了一下,因为我认为 messageBox 看起来更好一点:)
#!/usr/bin/perl
use strict;
use warnings;
use Tkx;
use Carp;
my $mw = Tkx::widget->new(".");
my $b = $mw->new_button(
-text => "Hello, world",
-command => sub { die "uh-oh"; },
);
$b->g_pack;
Tkx::eval(<<'EOT');
proc bgerror {message} {
tk_messageBox -title "Application Error" -message $message -icon error -type ok
destroy .
}
EOT
Tkx::MainLoop();
到目前为止,这是最好的解决方案,但赏金还剩 5 天,所以请继续提供这些答案!