CGI::Application::Dispatchで例外キャッチ
ちょっとはまったので、メモがてらネットにリリース。
CGI::Applicationを使ってたアプリで、何かしら異常があったらメールを飛ばすようにしてたんですが、
use strict; use warnings; use CGIApp; my $webapp = CGIApp->new(); eval{ $webapp->run(); }; if($@){ sendmail($@); # 警告メール送信処理 }
アプリが大きくなってきたのでCGI::Application::Dispatchを使用して
use strict; use warnings; use CGI::Application::Dispatch; eval{ CGI::Application::Dispatch->dispatch(default => 'Index'); }; if($@){ sendmail($@); # 警告メール送信処理 }
とやると、Index.pmで例外が起きてもCGI::Application::Dispatchの中でキャッチして、よしなに処理を進めてしまうので、例外が外に出てきません。
ソースを見るとhttp_errorというメソッドで処理しているようなので、オーバーライド。
package MyApp; use strict; use warnings; use base qw(CGI::Application::Dispatch); sub http_error{ my ($self , $exception , $url) = @_; sendmail($exception->error); # 警告メール送信処理 $self->SUPER::http_error($exception , $url); } MyApp->dispatch(default => 'Index');
これで一応動いてます。