2010/11/26
2010/11/01
■ [perl] WWW::Mechanize でアクセスしたときのエラー処理
perl から WWW::Mechanize を使って,Web ページを解析していたときに,ページが取得できなかったときのことを考えずにコードを書いていました.
しかし実際はサーバから Temporarily Unavailable が返ってくるとプログラムごと終了してしまいました.
そこで下記のように get したあとに結果を確認するようにしたのですが,結局 get した時点でエラーを吐いて終わってしまいました.
my $mech = WWW::Mechanize->new(); $mech->get("http://whitebase.org/"); if ($mech->success()) { # code for page access print "ok\n"; } else { # code for not success print "not ok\n"; }
$mech->success() 自体使えないじゃないかと思いながら,WWW::Mechanize の仕様を確認してみると,下記のように書いてあり,デフォルトでエラー時には CORE::die が呼び出されているということがわかりました.
onerror => \&func Reference to a die-compatible function, such as Carp::croak, that is called when there's a fatal error. If this is set to undef, no errors will ever be shown. If this value is not passed, Mech uses Carp::croak if Carp is installed, or CORE::die if not.
ということで,mechanize を new するときに下記のように書くと,エラー時には何も成功するまでトライ(汗)するようになりました... 実際には retry の処理などを書かないといけないのですが,get 時に問題があったら終了しないようにはできそうです.
my $mech = WWW::Mechanize->new(onerror => undef); until (my $response = $mech->get("$url")) {}
関連リンク