2

私はautodieビルトインからの例外を処理するために使用します。残念ながら、そのスコープはレキシカルで autodieあり、メソッドでは機能しません。クラスメソッドから例外をスローして、オートダイ例外と同じ方法で処理することはできますか? 要するに、クラスのユーザーに 2 つの方法で例外を処理させたくありません。1 つは autodie がビルトインに提供する豊富な例外クラスで、もう 1 つはdie if ...コードがスローする単純な " " です。

それが役立つ場合、私はMoose自分のクラスを構築するために使用します

4

2 に答える 2

2

ソースを見るautodieと、次を使用して死んでいることがわかります。

    Carp::croak sprintf(
        ERROR_WRONG_FATAL, $Fatal::VERSION, $VERSION, $autodie_path
    );

コードから同じことを行うと、呼び出し元のコードが同じように見えるものを受け取ることが期待されます。

編集:この回答のコメントで指摘されているように、autodie実際には 内から死にますFatal。ソースを 5 分間見ても、Fatalどのように/どこ死ぬかはわかりませんでした.[1]

ソースを掘り下げたい場合を除きFatal、次のオプションは、例外のどの機能autodieが重要かを定義し、それらを複製することです。autodie質問から、これは、使用される例外クラスを識別し、同じクラスの例外オブジェクトをスローするのと同じくらい簡単に思えるかもしれません。

[1]Fatalには、「Fatal がしないことを行うため、代わりに autodie を使用してください」というコメントがたくさんありますが、autodieほとんどすべてを に委譲しているように見えます。 ...FatalautodieFatalFatal

于 2011-05-14T21:26:19.833 に答える
2

例外をオートダイのようにしたい場合は、次の 2 つのオプションを考えることができます。

クラスを使用または継承しautodie::exceptionます。

これは非常に簡単で、perldoc autodie::exception新しいオブジェクトを作成するときに必要な引数に注意してください。autodie::exceptionから継承すると、柔軟性や機能性が向上する場合があります。その場合は、継承する必要があります。

autodie独自の例外クラスを使用するように指示します。

これは少しトリッキーですが、それほど難しいことではありません。

# Inside my/autodie.pm

pacakge my::autodie;
use parent 'autodie';

sub exception_class { return 'my::exception::class'; }

1;

その後、コード内で (レキシカル スコープで) を使用できますが、例外がスローされるたびに、 からではなく からmy::autodieオブジェクトを作成してスローします。これはおそらくやり過ぎですが、スタックバックトレース、ローカリゼーション、またはその他の機能を提供するために の例外を拡張したい場合などに非常に便利です。my::exception::classautodie::exceptionautodie

于 2011-05-20T16:34:14.580 に答える