10

Perlのメソッドチェーンでスローされた例外を処理するための最良の方法は何ですか?チェーンされたメソッドのいずれかが例外をスローする場合は、0またはundefの値を割り当てたい

コードサンプル:

my $x = $obj->get_obj->get_other_obj->get_another_obj->do_something;

それを行うための最良の方法は何ですか?毎回try/catch / finalステートメントでラップする必要がありますか?これを適用したいコンテキストは次のとおりです。CatalystとDBICを使用してWeb開発に取り組んでおり、連鎖した結果セットを多数実行しています。この結果セットの一部が例外をスローした場合は、値0またはundefを割り当てて、これを処理します。テンプレートのエラー(テンプレートツールキットを使用しています)。すべての呼び出しをtry/catchでラップせずにそれを行う別の方法がある場合は、私に知らせてください。同じコンテキスト(Catalyst / DBIC / TT)でこのタイプのエラーを処理するためのより良い方法を知っている場合は、提案してください。実用的な例は、ユーザーが何かを検索し、これが存在しない場合です。

4

3 に答える 3

9

これは、障害が発生した時点で null オブジェクトを返すことで処理します。そのオブジェクトは、単に自分自身を返すことによってすべてのメソッドに応答するため、残りのメソッドを使い果たすまでそれを続けます。最後に、$xそれが期待した結果なのか、それともこの null オブジェクトなのかを調べます。

以下にその例を示します。

use v5.12;

package Null {
    my $null = bless {}, __PACKAGE__;
    sub DESTROY { 1 }
    sub AUTOLOAD { $null }
    }

メソッドが呼び出されるたびに、AUTOLOAD はそれをインターセプトし、空のオブジェクトを返します。

エラーが発生すると、これらの Null オブジェクトのいずれかが返されます。メソッド チェーンの途中でもオブジェクトが返されるので、次のメソッドを呼び出したときに Perl が爆発することはありません。

sub get_other_obj {
    ...;
    return Null->new if $error;
    ...;
    }

チェーンの最後で、返されたものが Null オブジェクトかどうかを確認できます。それがあなたが得たものなら、何か悪いことが起こりました。

それが基本的な考え方です。Null クラスを改良して、メッセージとそれが作成された場所を記憶させるか、いくつかのポリモーフィック メソッド ( などsub is_success { 0 }) を追加して、取得するオブジェクトのインターフェイスとうまく連携させることができます。

これについてどこかに長いこと書いたと思ったのですが、今は見つかりません。

更新:それらの文章のいくつかを見つけました:

于 2011-08-15T17:23:19.967 に答える
-1

1 つのアイデアは、インスタンス オブジェクトが文字列/数値/ブール値のコンテキストで評価されるときに false 値を返すために使用するクラスを作成することoverloadですが、それでもメソッドを呼び出すことができます。AUTOLOADメソッドは常に戻り$self、メソッド チェーンが同じエラーを伝播できるようにします。

于 2011-08-15T17:24:15.337 に答える