• ベストアンサー

Perl/TkのWWW::MechanizeのGET失敗時の動作

WindowsにてPerl/Tkを使用しております。 WWW::MechanizeのGETを使って(おそらく)404 not foundを受信した後の動作の制御の仕方がわかりません。 下記ソースを実行して貰うとわかると思うのですが、 GETが失敗したら即sub関数内をreturnしてしまいます。 #!/usr/bin/perl use Tk; use Encode; use WWW::Mechanize; my $mech = new WWW::Mechanize(autocheck => 1); my $main = MainWindow->new; $main->Button(-text=>decode("cp932",'取得'),-font => ["MS ゴシック", 12], -command => \&get_source) ->grid(-row=>0,-column=>0); my $list = $main->Listbox(-selectmode=>'single',-font => ["MS ゴシック", 12]); $list->grid(-row=>1,-column=>0,-sticky=>'ew'); MainLoop; sub get_source{ my $uri = "http://www.google.co.jp/abcd"; $mech->get($uri); print "get_source end\n"; } 上記の「print "get_source end\n";」は実行されません。 データ取得先サイトがメンテナンス中は404になるようで困っています。 イメージでは「$mech->get($uri) or die "get_source error";」みたいな感じにエラーの場合の時の処理を記述したいのです。 ご存知の方いましたらご教示願います。 使用環境 ・Windows XP Professional SP3 ・Active Perl v5.8.6 for MSWin32-x86-multi-thread build811 ・自作PC(CPU:Athlon 64 3800+)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

Mechanizeのgetは404とかだと例外を出すようですね。 #!/usr/bin/perl use warnings; use strict; use WWW::Mechanize; my $uri = shift || 'http://www.google.co.jp/abcd'; my $mech = new WWW::Mechanize( autocheck => 1 ); eval { $mech->get($uri); }; if ($@) { # 失敗 warn $mech->status, " : $@"; } my $res = $mech->response; print $res->content, "\n";

xkuonx
質問者

お礼

いつもお世話になってます。 上記で無事にできました! 例外が出されていたんですね。 失敗時を明示的にできるので気に入っています。 回答ありがとうございました。

その他の回答 (1)

回答No.2

my $mech = new WWW::Mechanize( autocheck => 1, onerror => undef ); として、 $mech->get($uri); print "get_source error\n" unless $mech->success(); または、 my $mech = new WWW::Mechanize( autocheck => 1, onerror => sub { die "get_source error"; } ); でどうでしょう。

参考URL:
http://digit.que.ne.jp/work/product/document/perldoc/WWW-Mechanize-1.02/Mechanize.html
xkuonx
質問者

お礼

なるほど…そういう手段があったのですね。 onerror=>でエラー時のサブルーチンに飛ばすと エラー対処箇所が多い場合には有効ですね。 今回はエラー時の対応が明示的になるので回答1を採用させて頂きます。 回答ありがとうございました。

関連するQ&A