Я работаю над приложением Perl Tkx, и у меня возникают проблемы с получением полезных/правильных сообщений об ошибках. Я пытаюсь использовать croak, поэтому он скажет мне, где именно он терпит неудачу, но каждый раз, когда он скрипит, он просто говорит, что ошибка находится «на C: /Perl64/lib/Tkx.pm, строка 347.»Обработка ошибок с использованием Perl Tkx
Я написал очень простой сценарий, чтобы продемонстрировать, что происходит:
#!/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 похожими на использование croak в регулярный скрипт Perl? есть ли способ заставить каркас печатать на STDOUT или STDERR?
EDIT:
Майкл Карман приносит хорошую точку, как правило, с графическим интерфейсом консоль будет подавлено, и пользователь никогда не увидит сообщение об ошибке отправлено в STDOUT или STDERR, но то, что о поиске способ изменить текст в диалоговом окне «Ошибка приложения», чтобы сказать что-то полезное? Это возможно?
Текст не обязательно должен быть полезен конечному пользователю, но должен быть по крайней мере понятен программисту, чтобы они знали, где искать проблему, когда она сообщается конечным пользователем.
EDIT2:
Хорошо оказывается, что с помощью die
или confess
вместо croak
печатает сообщение более полезной ошибке в окне «Ошибка приложения», но когда я нажимаю «ОК» программа просто продолжается и фактически не умирает. Как я могу «убить его до тех пор, пока он не погибнет» и не оставит его мертвым?
ВОЗМОЖНОЕ РЕШЕНИЕ:
Вот возможное решение построено прочь ответ Майкл Карман в. Я изменил его немного, потому что я думаю, что 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 дней все еще остаются в щедрот так держать эти ответы приходят!
Это выглядит как хорошее решение .. Я думаю, что это будет трудно улучшить, что :) –