されたPerl:ダイのないキャッチエラー
-
26-09-2019 - |
質問
私は、エラー処理で遊んで少し問題を抱えています。 私は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
(フラグに応じて)をラップすることである。
このようなクエリの再試行、統計、自動フェイルオーバーおよびそれ以上のものとして、私たちはデータ・アクセス・レベルでのカスタムエラー処理を行うことができます - 。残りのコードへのすべての透明