

ファイルサーバのようなものを作っています。  
PDF ファイルのサムネイルを ImageMagick を使って生成しているのですが、ImageMagick でエラーが出る PDF ファイルがあります。  
そのファイルの場合、単にサムネイルを使わないようにしたいのですが、try::tiny で囲んでも期待する結果になりません。

コード

[code]

    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;
    }
    
[/code]

出力 HTML ファイル

[code]

    <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>
    
[/code]

単に、catch ブロックのみを返したいのですが・・・。

## 追記

ernix さん、回答ありがとうございます。  
以下のように書き換えました。

[code]

        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>";
        }
    
[/code]

同じエラーが出ます。  
教えていただいた回答が私には難しすぎるようです…。


CC BY-SA 4.0
2017-04-12T11:16:30.797
33955
2019-03-29T02:01:41.580
2019-02-26T13:53:44.167
19110
9674
question
perl imagemagick
Try::Tiny で ImageMagick の例外を処理するには

[code]

    #!/usr/bin/perl
    use 5.022;
    use strict;
    use warnings;
    use Try::Tiny;
    
    sub wrong {
        try {
            die "ERROR";
        }
        catch {
            my $ret = "CATCH";
            return $ret;
        };  # 最後の";"を忘れずに
    
        return "try/catch からの `return` はサブルーチンを抜けない。";
    }
    
    sub right {
        return try {  # ここにreturnが入るとサブルーチンから抜ける。
            die "ERROR";
        }
        catch {
            my $ret = "CATCH";
            return $ret;
        };
    
        return "この行には到達しない。";
    }
    
    sub using_eval {
        my $ret = eval {
            die "ERROR";
    
            #
            # 上のコードが死ななかった場合に、
            # `|| do`以下のブロックを評価しないよう1を返す。
            #
            # ブロック内でreturnを書くとサブルーチンのreturnと混同しやすいので、
            # returnは書かず単に最後に評価させるのが望ましい。
            #
            1;
        } || do {
            "ブロックでは、returnが無い場合最後に評価された値が返る。";
        };
    
        return $ret;
    }
    
    say wrong();
    say right();
    say using_eval();
    
    1;
    
[/code]


CC BY-SA 3.0
2017-04-14T04:11:09.440
33998
2017-04-14T04:11:09.440
62
33955
answer