76

Perl コミュニティのコンセンサスは、Try::Tiny例外を処理するための好ましい方法であるようです。

Perl 5.14 (私が使用しているバージョン)は、そのアドレスの問題解決しているようです。それでも私に利益をもたらしますか?evalTry::TinyTry::Tiny

4

6 に答える 6

34

私の答えは人気がありませんが、Perl プログラマーは、Perl で「例外」と呼ばれるものの非常に貧弱な概念を使用しようとするべきではないと思います。これらは基本的にサイド チャネルの戻り値です。ただし、グローバル変数を使用して状態を渡すという複雑さがあるにもかかわらず、例外のアイデアにまだ夢中になっているため、人々はそれを機能させようとし続けています。

しかし、実際には、人々はdie失敗を知らせるために使用します。参照を使用してエラー オブジェクトを返すことができると言う人もいますが、そのdie必要はありませんdie。オブジェクトがあるので、オブジェクトのすべての機能を使用する必要があります。

 sub some_sub {
    ...
    return Result->new( error => 1, description => ... ) if $something_went_wrong;
    return Result->new( error => 0, ... );
    }

 my $result = some_sub( ... );
 if( $result->is_error ) { ... };

これには、グローバル変数、離れた場所でのアクション、スコーピングの頭痛の種、特別なスペシャルの必要性は含まれません。小さなクラスResult、またはそれを呼び出したいものを作成して、戻り値をラップし、ID のない単一の値ではなく構造化データを作成します。戻り値が何を意味するのか疑問に思う必要はもうありません。それundefは実際の値ですか、それとも失敗の兆候ですか? 定義されている場合、またはtrueの場合、戻り値は良いですか? オブジェクトはこれらのことを教えてくれます。そして、同じオブジェクトを で使用できますdie。すでにオブジェクトをdie使用しており、それを戻り値として使用している場合、容認するために必要なすべての余分なことを推奨することはほとんどありません$@

これについては、「例外をスローする代わりにエラー オブジェクトを返す」で詳しく説明しています。

しかし、他の人がしていることをあなたが助けることができないことはわかっているので、Perl には例外があるふりをする必要があります。

于 2012-04-29T17:28:46.543 に答える
14

他に何もないとしても、Try::Tinyそれでも素晴らしいシンタックス シュガーです。もう少し重いものが必要な場合はTryCatch、 の句がサブルーチンであるという事実に関連するいくつかの問題を解決するもありTry::Tinyます (たとえば、return囲んでいる関数を離れません)。

于 2012-04-28T18:15:46.113 に答える
11

Try::Tiny簡単で軽量です。簡単すぎる。2つの問題がありました。

  • 匿名のreturn潜水艦-内部の''ステートメントには常に問題がありました
  • 常にすべてをキャッチ

だから私はにいくつかの変更を加えましたTry::Tiny、それは私たちを助けます。今、私たちは持っています:

try sub {},
catch 'SomeException' => sub {},
catch [qw/Exception1 Exception2/] => sub {},
catch_all sub {};

私は知っています-この構文は少しエキゾチックですが、明らかな''のおかげでsub、プログラマーは' return'ステートメントが例外ハンドラーからのみ終了することを知っています。常にキャッチしたいこの例外のみをキャッチします:)

于 2012-04-28T19:03:37.567 に答える
0

Either do:

local $@;
eval { … }

… to prevent changes to $@ from affecting global scope, or use Try::Tiny.

Syntactically, there are situations where I prefer one or the other.

于 2016-08-22T15:37:53.627 に答える