2

よろしくお願いします。

私はエラー処理についていくつかの調査を行ってきましたが、何をすべきかをしっかりと理解しているとは思えません。

前文:私のコードはApacheにあり、ブラウザーで実行されます。私の目標にはコマンドラインの実行は含まれていません。

CGI :: Carp(fatalsToBrowser)の動作に、出力をキャプチャして自分のテンプレートページにスローしたり、電子メールで送信したりできるようにしたいのですが...fatalsToBrowserが機能しないことに気づきましたmod_perlを使用します。誰かが理由を知っていますか?Apache / mod_perlはどのように邪魔になっていますか?


最初の目標:コードがmod_perlまたはmod_cgiで実行されている場合に機能するものをまとめたいと思います。

2番目の目標:.NETのApplication_Error(global.asax内)およびPHPのset_exception_handler()およびset_error_handler()メソッドと同様のすべてのエラーをキャッチする高レベルのメソッドが必要です。これらを使用すると、厄介な/ gross try-catchステートメントでコードをラップすることなく、エラーが発生したときに制御を取得できます。


私が読んだ/レビューしたもの:

1.)PerlでのOO例外処理ですが、私が探していたものではありませんでした。私がキャッチしたいもののほとんどはdie()ingです。次のリンクにも、この記事は古く、廃止されていると書かれています。

2.)Perl:$ SIG {__ DIE __}、eval {}、およびスタックトレースですが、これは私の目標に関連してあまり得られませんでした。

3.)実用モードPerl(O'Reilly)、第21章「エラー処理とデバッグ」。ありがたいことに、私のperlコードはすべてstrictを使用しており、警告が有効になっています。第6章「mod_perlを使用したコーディング」で説明した最も重要なことはすでに実行されています。

4.)「LearningPerl」、「Perl Cookbook」、「Programming Perl」、「Higher Order Perl」の目次を調べましたが、目立つものは何も見つかりませんでした。私がそこで何かを逃したと思うなら、私に知らせてください。:)


どこにあるのか覚えていません(おそらく「Practicalmod_perl」にありますが、$SIG{__DIE__}をいじってはいけないことを読みました。

4

2 に答える 2

1

どのような種類のエラーをキャッチしようとしていますか?カスタムエラーページはあなたの目的には十分ではありませんか?

私のCGIスクリプトは短いです(OK、これは本当に骨の折れるものです—そしてテストされていません):

#!/usr/bin/perl

use strict;
use warnings;

use My::App;
use My::ErrorReporter qw( error_to_html );

run();

sub run {
    my $app = eval {
        My::App->new(
            'some_param',
            'another_param',
        )
    };

    unless ( $app ) {
        print error_to_html( $@ );
        return;
    }

    eval {
        $app->handle_request;        
    } and return;

    print error_to_html( $@ );
    return;
}

__END__

今、fatalsToBrowserあなたのユーザーのためではありません。それはあなたのための開発援助です。ユーザーに表示されるエラーメッセージは、プログラムに関する情報を伝えるべきではありません。したがって、たとえば、構成ファイルを開いて読み取るルーチンでは、次のようなことを行う必要があります。

sub read_my_config {
    my $self = shift;

    open my $config_h, '<', $self->config_file;

    unless ( $config_h ) {
        # This goes to the Apache error log where you can read it
        warn sprintf(
            "Cannot open '%s': %s", 
            $self->config_file, $!
        );
        # This is for web site visitors to see
        die "Cannot open configuration file";
    }

    # rest of the code
}
于 2009-07-23T21:29:58.787 に答える
1

代替の例外処理手法mod_perlに関するWebサイトのビットを読んだことがありますか?を使用する代わりにグローバル関数をオーバーライドすることで、キャッチされない例外をキャッチする方法について説明します。はるかにクリーンな方法ですが、完璧ではありません。die()$SIG{__DIE__}

于 2009-07-24T00:13:11.207 に答える