ヘトラブルシューティングを一貫して再現性のmod_perl2/$SIG{__金型__}グ

StackOverflow https://stackoverflow.com/questions/2144155

質問

これはmod_perl2はApache2.2からは、ActiveState Perl5.10win32.

私はオーバーライド $SIG{__DIE__} on DBIのRaiseErrorフラグは、AFAICTからのドキュメントは、コマのオーバーライドがデータベース電話は失敗します。そうでほとんどを除き、一例は、私は理解できないかがでしょうか。

私のスクリプトは、 our $page 変数、mod_perl2、できることから、オーバーライドはこのように:

use Carp::Trace;
my $full_trace = Carp::Trace::trace;
$full_trace =~ m/^(ModPerl::ROOT::ModPerl::Registry::.*::)handler .*$/m;
my $page;
if (defined $1)
{
    eval '$page = $' . $1 . 'page';
    if (defined $page)
    {
        $json = 1 if defined $$page{json_response};
        if (defined $$page{dbh})
        {
            my $errno = $$page{dbh}->state;
            if ($errno ~~ $$page{error_handling}{allowed})
            {
                # allowed to let it go--no report, expected possible user error at some level that couldn't be caught sooner (usually db level)
                my $errmsg = $$page{error_handling}{translation_map}{$errno};
                if (defined $errmsg)
                                    {
                                               ...

この作品です。現在、その $page, い配列refの'可'エラー値をもう少し前向きなことをやりたいなときっからのDBです。時をDB投これらの誤りがたい訳では、ユーザーに優しいメッセージ $r->print このJSON、執行動す何らかの理由で代わりに制御を戻すのスクリプト(動B)。

こちらは、私のスクリプト:

{
    $$page{error_handling}{allowed} = ['22007'];
    $$page{json_response}{result} = $page->one_liner("select 'aa'::timestamp");
    $$page{json_response}{test} = $$page{error_handling}{state};
}
    $page->make_json; # just JSONifies $$page{json_response} and prints it

ればコメントの最初の行にとって普通のエラーの取扱いにかかわらず不測の事態が発生し)(行動するには何を期待していない追加しているとエラーが表示されるのがあったことによって生じたリストに許されます。何が本当に不思議ながるばかりカットが最初の行に貼付けることで私の $SIG{__DIE__} オーバーライドを動作させることができ:の応答結果のJSONにはオーバーライドし、印刷および執行停止前 {test} 割り当て(行動す他人のものまで設定する事が可能で {allowed} 載のセット番号など)が含まれているため'22007"特に、行動B.っていることを確認してくださいがきちんと行動C.もっとらなければならないのに、私が実際に記入し私のオーバーライドした(警告の通話を CORE::die, 等--として統)を取得します行為Bにはまだ--でも、オーバーライドしなくなっ列をコードするということなので可能です!まかないので期待される成果を求め warnCORE::die, は、静寂のログなんでもう手のパスの実行を通じてオーバーライド.

私は再Apache2になります。2間毎にスクリプト保存します。いものに移転オーバーライドが同じスクリプトファイルとしてのスクリプト自体のモジュールで、通常は、コメントアウトされている全モジュールファイルのオーバーライドでは、通常は、再起動。

った場合には出ること、または'22007すい warndie その他に手動でデバッグすべての私のように、作品として期待される。何と言っても、'22007'ることはありませんの出力も異なるもののサーバーをリセット?ありませんを参照'22007'このプロジェクト全体の翻訳、地図上もしよろしくお願いしますからそのファイル全てを再起動し、結果には変わりありません。で正している場合は、キャッシュされた私のオーバーライドならではの日を決めます。なブラウザのキャッシュ号のいずれかで、できる追加のランダムクエリ文字列に変わりありません。

これは奇妙なも悔しいmod_perl2経験だけはノリノリでうたってまで、思い出のアイデア。なんてのヒント?しかし、面白いことを考えることができることでキャッシュ問題をいかを再起動したサービスは無数の倍。

以来、一日の終わりたいと思いく完全再開サーバーにコンピュータでも変わらないんだよね。でも、電源の再投入により自動的に復帰サーバー変更のみライン {state} が割り当てられます:

$$page{error_handling}{state} = 'my face'; # $errno;

それなのに、出力後にした {test} として22007、何をすべきだった = $errno はそのままにします。

した場合といえども、リバースプロキシでのキャッシュ、こうした状況になるのは意味のあることでしょうから要請ができなければならないと思います。した後、フルサーバの再起動が可能ですが価格をつけなくなったのコードをどのようにできま緒に $SIG{__DIE__} オーバーライドした後、フル再起動できなくなり存在する任意のファイルとは何ですか?

更新: もしに変更する可誤'42601'変更のdbの呼び出 'select', を製造しているとエラーコードがなかったに追加し、翻訳図。でも私の行動Bの設定 {state} を42601'な特'22007'.の他のエラーコード入 {allowed}, いる場合には、実際にエラーが発生した場合には、走る、古いバージョンのオーバーライド.るとエラーが出ることのない {allowed} とで、現在のバージョン。がどのようなものかどうか現在のエラーが {allowed}, れるものとは、何も前のものは、オーバーライド?が実際に近いものであるかどうかのオーバーライドでも通りにくい難所であったため {allowed} はgrepped現在のエラーになります。)

役に立ちましたか?

解決

これは私の一時的な回避策ですが、私は私が許容されるエラーとDBの呼び出しを持ってどこでも余分な行を追加する必要はありませ謎を解決したいと思います。

package MyModule::ErrorLogging;
sub InsanityWorkaround # duplicates part of $SIG{__DIE__} override for allowed errors
{
    my ($page) = @_;
    my $r = $$page{r};
    my $errno = $$page{error_handling}{state};
    if ($errno ~~ $$page{error_handling}{allowed})
    {
        # allowed to let it go--no report, expected possible user error at some level that couldn't be caught sooner (usually db level)
        my $errmsg = $$page{error_handling}{translation_map}{$errno};
        if (defined $errmsg)
        {
            use JSON::XS qw(encode_json);
            $$page{json_response} =
            {
                error => $errmsg,
            };
            my $response = encode_json($$page{json_response});
            $r->content_type("application/json");
            $r->print($response);
            exit(0);
        }
        else
        {
            return 0; # get back to script where {state} can be checked and output can be customized even further
        }
    }
    return;
}

そして、私のスクリプトは次のようになります。

{
    $$page{error_handling}{allowed} = ['22007']; # don't be bothered by invalid timestamp error
    $$page{json_response}{result} = $page->one_liner("select 'aa'::timestamp");
    MyModule::ErrorLogging::InsanityWorkaround($page);
}

これは行動Aを与えている。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top