最新 RSS

horiday blog

2010/11/1

[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")) {}

関連リンク