18

私は大規模な Perl アプリケーションで作業しており、'die' が呼び出されるたびにスタック トレースを取得したいと考えています。私はCarp モジュールを認識していますが、「die」のすべてのインスタンスを「confess」で検索/置換したくないと考えています。さらに、Perl モジュールまたは Perl インタープリター自体のエラーの完全なスタック トレースが必要ですが、Carp を使用するようにそれらを変更することはできません。

それで、「自白」のように動作するように、実行時に「死ぬ」関数を変更する方法はありますか? または、「ダイ」から完全なスタック トレースをスローする Perl インタープリター設定はありますか?

4

4 に答える 4

32

Devel::SimpleTraceCarp::Alwaysを使えば、あなたが何の苦労もせずに求めていることを実行してくれます。これらにはグローバルな効果があります。つまり、たとえば-MDevel::SimpleTrace.

于 2009-12-09T23:24:11.093 に答える
13

__DIE__シグナルハンドラの設定はどうですか?何かのようなもの

$SIG{__DIE__} = sub { Carp::confess @_ };

あなたのスクリプトの一番上に?詳細については、 perlvar %SIGを参照してください。

于 2009-12-09T23:24:21.047 に答える
3

die私は通常、少しのコードで sを置き換えたいだけなので、__DIE__ハンドラーをローカライズします。

 {
 use Carp;
 local $SIG{__DIE__} = \&Carp::confess;

 ....
 }

これは開発ツールとして機能しますが、一部のモジュールは機能を動作させるためにこれを使用します。これらの機能は、予期していたハンドラーをオーバーライドすると、奇妙な方法で壊れる可能性があります。これは良い習慣ではありませんが、時々起こります。

于 2009-12-10T18:00:42.383 に答える
0

Errorモジュールは、すべてdieの をオブジェクトに変換します。このError::Simpleオブジェクトには、完全なスタック トレースが含まれます (コンストラクターは、"at file... line.." テキストを解析し、スタック トレースを作成します)。任意のオブジェクト (通常は からサブクラス化Error::Simple) を使用して、設定でエラーを処理でき$Error::ObjectifyCallbackます。

これは、他のイベントを通知するために他のタイプの例外を頻繁にスローする場合に特に便利です。その場合、ハンドラーError::Simple(またはエラーに使用している他のクラス) を追加し、スタックトレースをダンプするか、状況に応じて特殊なログを実行します。エラーの種類。

于 2009-12-09T23:55:31.657 に答える