Show
Ignore:
Timestamp:
11/19/08 21:07:36 (5 years ago)
Author:
tokuhirom
Message:

エラー処理の方式を http://d.hatena.ne.jp/kazuhooku/20081119/1227094964 と同じにした。kazuho++

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lang/perl/MENTA/trunk/lib/MENTA.pm

    r24294 r24324  
    3636 
    3737    # エラー発生時にスタックトレースを出すための処理 
     38    my $errinfo; 
    3839    local $SIG{__DIE__} = sub { 
    39         my $msg = shift; 
     40        my ($msg, ) = @_; 
    4041        warn $msg unless ref $msg; 
    4142        return $msg if ref $msg && ref $msg eq 'HASH' && $msg->{finished}; 
     
    7576            $i++; 
    7677        } 
    77         die { message => $msg, trace => \@trace }; 
     78        $errinfo = { message => $msg, trace => \@trace }; 
     79        die @_; 
    7880    }; 
    7981 
    8082    # 例外をまっこうからうけとめる 
     83    local $@; 
    8184    eval { 
    8285        my $path = $ENV{PATH_INFO} || '/'; 
     
    130133            die "${path} を処理する方法がわかりません"; 
    131134        } 
     135 
     136        undef $errinfo; 
    132137    }; 
    133138    # 発生した例外をすかさず処理する 
    134     if (my $err = $@) { 
    135         die "エラー処理失敗: ${err}" unless ref $err eq 'HASH'; 
    136         return if $err->{finished}; 
    137  
    138         warn $err->{message}; 
     139    if ($errinfo) { 
     140        die "エラー処理失敗: ${errinfo}" unless ref $errinfo eq 'HASH'; 
     141        return if $errinfo->{finished}; 
     142 
     143        warn $errinfo->{message}; 
    139144 
    140145        print "Status: 500\r\n"; 
     
    144149        my $body = do { 
    145150            if ($config->{menta}->{kcatch_mode}) { 
    146                 my $msg = escape_html($err->{message}); 
     151                my $msg = escape_html($errinfo->{message}); 
    147152                chomp $msg; 
    148153                my $out = qq{<!doctype html><head><title>500 Internal Server Error</title><style type="text/css">body { margin: 0; padding: 0; background: rgb(230, 230, 230); color: rgb(44, 44, 44); } h1 { margin: 0 0 .5em; padding: .25em .5em .1em 1.5em; border-bottom: thick solid rgb(0, 0, 15); background: rgb(63, 63, 63); color: rgb(239, 239, 239); font-size: x-large; } p { margin: .5em 1em; } li { font-size: small; } pre { background: rgb(255, 239, 239); color: rgb(47, 47, 47); font-size: medium; } pre code strong { color: rgb(0, 0, 0); background: rgb(255, 143, 143); } p.f { text-align: right; font-size: xx-small; } p.f span { font-size: medium; }</style></head><h1>500 Internal Server Error</h1><p>${msg}</p><ol>}; 
    149                 for my $stack (@{$err->{trace}}) { 
     154                for my $stack (@{$errinfo->{trace}}) { 
    150155                    $out .= '<li>' . escape_html(join(', ', $stack->{package}, $stack->{filename}, $stack->{line})) 
    151156                         . qq(<pre><code>$stack->{context}</code></pre></li>);