質問

私は、エラー処理で遊んで少し問題を抱えています。 私はDBIモジュールを使用してデータベースに接続します。

私は、エラー時に呼び出すことサブルーチンを使用することによって自分自身のエラー処理を行います。

私は自分の金型をキャッチし、うまくそれらを扱うが、私のデータベース接続が失敗したときにすることができ、DBIモジュールは明らかに、それは自身のダイだ出力します:

   DBI接続(...)は失敗しました:ORA-12154:TNSは:解決できませんでした       ...

で:接続識別子は、(DBDてOCIServerAttachエラー)を指定しました

私はこれをキャッチしに行くかどう?

私はそうのような$SIG{__DIE__}を使用してみました

local $SIG{__DIE__} = sub {
  my $e = shift;
  print "Error: " .$e;
};

これは、私も自分のモジュールで提供され、接続サブルーチンを呼び出すこのファイルには、私のメインのファイルの一番下にあります。私も自分のモジュールの底面のコードのこの部分を入れてみましたが、それはまだ

せずにエラーを出力します
  

エラー:

その前に

役に立ちましたか?

解決 2

エラーがスローされた場所の前に、さて、解決策を見つけ、どうやら私が代わりに__WARN____DIE__とファイルの先頭にあることが必要なコードのこの部分を必要に応じて、例とは異なり、私が述べてお読みください。)

他のヒント

  

DBI接続(...)は失敗しました:ORA-12154:   TNS:接続を解決できませんでした   識別子指定(DBDのERROR:   ...

でてOCIServerAttach)      

私はこれをキャッチしに行くかどう?

エラーのこのレベルをキャッチし、処理するには、

、ブロック形式で利用評価、「評価{...}」。これは、サブコードで起こるすべてのダイをキャッチします。 evalのブロック金型内のコードが、それは$ @を設定し、ブロックはfalseを返します場合。コードが死なない場合は、$ @「」に設定されます。

私は別の信号を処理していながら、私は信号を取得する場合

SIG {WARN}とSIG {DIE}を経由して処理する信号を使用すると、面倒で、彼らはグローバルなので、考慮すべきレースの条件は(もある何が起こる?など信号ベースのコンピューティングの伝統的な問題)。あなたは、ダイを呼び出し、複数の物事の同時実行の問題を心配していないので、あなたはおそらく、シングルスレッドコードを書いているが、あなたはDBI接続をオープンしようとしている間、多分彼はSIGKILLをお送りします(検討するユーザーがあります)

この特定のケースでは、DBIを使用しています。それは、死ぬ警告、または静かに失敗し、リターン・ステータスを確認するのを待つ必要がある場合DBIを使用すると、エラーが発生した場合に何が起こるかを制御できます。

はここではeval {...}を使用する基本的な例です。

my $dbh = eval { DBI->connect( @args) };
if ( $@ )
{
    #DBI->connect threw an error via die
    if ($@ =~ m/ORA-12154/i )
    {
        #handle this error, so I can clean up and continue
    }
    elsif ( $@ =~ m/SOME \s* other \s* ERROR \s+ string/ix )
    {
       #I can't handle this error, but I can translate it
        die "our internal error code #7";
    }
    else 
    {
      die $@; #re-throw the die
    }
}

はevalこの方法を使用していくつかのマイナーな問題は$ @のグローバルスコープと関係することがあります。 試してみてください::タイニーのCPANのページには、偉大な説明があります。試してみてください::タイニーハンドル最小限のtry / catchブロックの設定およびハンドル@ $をローカライズし、他のエッジケースを扱うます。

あなたのSIG{__DIE__}ブロックでこれを含めます:

### Check if exceptions being caught.
return if $^S;

これはevalのブロック内でダイを生成し、例外ベースのコードで使用されているから、あなたのハンドラを防ぐことができます。

あなたが調整することができますなどPrintError、RAISEERROR、などのDBI、内のスイッチがたくさんあります。 http://search.cpan.org/perldoc?DBIする

を参照してください。

これは、全体的なダイキャッチャーのように汎用的ではありませんが、特にDBIエラーのために私たちが実際にデータベース・コールのラッパーを提供する当社独自のモジュールを持って取り扱います。モジュールの機能の一つは、各DBIコール周りeval(フラグに応じて)をラップすることである。

このようなクエリの再試行、統計、自動フェイルオーバーおよびそれ以上のものとして、私たちはデータ・アクセス・レベルでのカスタムエラー処理を行うことができます - 。残りのコードへのすべての透明

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