Try::Tiny で ImageMagick の例外を処理するには
ファイルサーバのようなものを作っています。
PDF ファイルのサムネイルを ImageMagick を使って生成しているのですが、ImageMagick でエラーが出る PDF ファイルがあります。
そのファイルの場合、単にサムネイルを使わないようにしたいのですが、try::tiny で囲んでも期待する結果になりません。
コード
try{
my $image = Image::Magick->new;
$image->Read("${file}[0]");
$image->Transform(geometry => $imgsize);
$image->Write($thumbnail);
undef($image);
$image = Image::Magick->new;
$image->Read($thumbnail);
$image->Resize($imgsize);
$image->Write($thumbnail);
undef($image);
}
catch{
$ret = "<div class = \"misc\">$ext</div>";
return $ret;
}
出力 HTML ファイル
<div class = "item"><div class = "misc"><a href = "_postcard.pdf">.pdf</a></dError: /undefined in findresource
Operand stack:
--dict:5/14(L)-- F1 9.0 --dict:5/5(L)-- --dict:5/5(L)-- MSGothic-90msp-RKSJ-H --dict:10/12(ro)(G)-- --nostringval-- CIDFontObject --dict:6/6(L)-- --dict:6/6(L)-- Adobe-Japan1
Execution stack:
%interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- false 1 %stopped_push 1862 1 3 %oparray_pop 1861 1 3 %oparray_pop 1845 1 3 %oparray_pop --nostringval-- --nostringval-- 2 1 1 --nostringval-- %for_pos_int_continue --nostringval-- --nostringval-- --nostringval-- --nostringval-- %array_continue --nostringval-- false 1 %stopped_push --nostringval-- %loop_continue --nostringval-- --nostringval-- --nostringval-- --nostringval-- --nostringval-- --nostringval-- %array_continue --nostringval-- --nostringval-- --nostringval-- --nostringval-- --nostringval-- %loop_continue
Dictionary stack:
--dict:1156/1684(ro)(G)-- --dict:1/20(G)-- --dict:75/200(L)-- --dict:75/200(L)-- --dict:106/127(ro)(G)-- --dict:286/300(ro)(G)-- --dict:22/25(L)-- --dict:4/6(L)-- --dict:25/40(L)--
Current allocation mode is local
Last OS error: 2
Error: /undefined in findresource
Operand stack:
--dict:5/14(L)-- F1 9.0 --dict:5/5(L)-- --dict:5/5(L)-- MSGothic-90msp-RKSJ-H --dict:10/12(ro)(G)-- --nostringval-- CIDFontObject --dict:6/6(L)-- --dict:6/6(L)-- Adobe-Japan1
Execution stack:
%interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- false 1 %stopped_push 1862 1 3 %oparray_pop 1861 1 3 %oparray_pop 1845 1 3 %oparray_pop --nostringval-- --nostringval-- 2 1 1 --nostringval-- %for_pos_int_continue --nostringval-- --nostringval-- --nostringval-- --nostringval-- %array_continue --nostringval-- false 1 %stopped_push --nostringval-- %loop_continue --nostringval-- --nostringval-- --nostringval-- --nostringval-- --nostringval-- --nostringval-- %array_continue --nostringval-- --nostringval-- --nostringval-- --nostringval-- --nostringval-- %loop_continue
Dictionary stack:
--dict:1156/1684(ro)(G)-- --dict:1/20(G)-- --dict:75/200(L)-- --dict:75/200(L)-- --dict:106/127(ro)(G)-- --dict:286/300(ro)(G)-- --dict:22/25(L)-- --dict:4/6(L)-- --dict:25/40(L)--
Current allocation mode is local
Last OS error: 2
iv><input type = "checkbox" name = "cb[]" value = "_postcard.pdf" /><a href = "_postcard.pdf">_postcard.pdf</a></div>
単に、catch ブロックのみを返したいのですが・・・。
追記
ernix さん、回答ありがとうございます。
以下のように書き換えました。
if(!(-f $thumbnail) or ((-M $thumbnail) > $elapsedtime)){
$ret = eval{
my $image = Image::Magick->new;
$image->Read("${file}[0]");
$image->Transform(geometry => $imgsize);
$image->Write($thumbnail);
undef($image);
$image = Image::Magick->new;
$image->Read($thumbnail);
$image->Resize($imgsize);
#$image->Resize("120x");
$image->Write($thumbnail);
undef($image);
return "<div class = \"img\"><a href = \"$file\"><img src = \"thumbnail\" class = \"img\" /></a></div>";
} || do {"<div class = \"misc\">$ext</div>";
};
return $ret;
}
if(-f $thumbnail){
$ret = "<div class = \"img\"><a href = \"$file\"><img src = \"$thumbnail\" class = \"img\" /></a></div>";
}
else{
$ret = "<div class = \"misc\">$ext</div>";
}
同じエラーが出ます。
教えていただいた回答が私には難しすぎるようです…。