システム トレイ アプレットに次の初期化コードがあります。
use Gtk3 -init;
use Glib::Object::Introspection;
eval {
Glib::Object::Introspection->setup(
basename => 'Notify',
version => '0.7',
package => "MyProgram::Notify",
);
};
if ($@) {
say "no notify because setup failed: $@";
$use_notify = 0;
} else {
MyProgram::Notify->init();
}
そのコードはfdpowermonに基づいていますが、多かれ少なかれGlib::Object::Introspection の POD にある例外処理の例から来ているようです。
しかし、perlcritic (レベル 3) はそれについて次のように主張しています。
Return value of eval not tested at line …
だから私はTry::Tinyでそれを書き直そうとしました:
use Gtk3 -init;
use Glib::Object::Introspection;
use Try::Tiny;
try {
Glib::Object::Introspection->setup(
basename => 'Notify',
version => '0.7',
package => "MyProgram::Notify",
);
} catch {
say "no notify because setup failed: $@";
$use_notify = 0;
} finally {
if (!$@) {
MyProgram::Notify->init();
}
}
しかし、perl は次のように主張します。
Can't locate object method "new" via package MyProgram::Notify::Notification
特にfinally
ブロックが実際の改善ではないことはわかりますが、Glib::Object::Introspection によって作成されたパッケージに関して、Try::Tiny を使用することでなぜこのような違いが生じるのか理解できません。
それとも、Try::Tiny よりも良い方法で、このコードをよりエレガントに、より読みやすくする方法はありperlcritic
ますか?