Perl コミュニティのコンセンサスは、Try::Tiny
例外を処理するための好ましい方法であるようです。
Perl 5.14 (私が使用しているバージョン)は、そのアドレスの問題を解決しているようです。それでも私に利益をもたらしますか?eval
Try::Tiny
Try::Tiny
Perl コミュニティのコンセンサスは、Try::Tiny
例外を処理するための好ましい方法であるようです。
Perl 5.14 (私が使用しているバージョン)は、そのアドレスの問題を解決しているようです。それでも私に利益をもたらしますか?eval
Try::Tiny
Try::Tiny
私の答えは人気がありませんが、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 には例外があるふりをする必要があります。
他に何もないとしても、Try::Tiny
それでも素晴らしいシンタックス シュガーです。もう少し重いものが必要な場合はTryCatch
、 の句がサブルーチンであるという事実に関連するいくつかの問題を解決するもありTry::Tiny
ます (たとえば、return
囲んでいる関数を離れません)。
Try::Tiny
簡単で軽量です。簡単すぎる。2つの問題がありました。
return
潜水艦-内部の''ステートメントには常に問題がありましただから私はにいくつかの変更を加えましたTry::Tiny
、それは私たちを助けます。今、私たちは持っています:
try sub {},
catch 'SomeException' => sub {},
catch [qw/Exception1 Exception2/] => sub {},
catch_all sub {};
私は知っています-この構文は少しエキゾチックですが、明らかな''のおかげでsub
、プログラマーは' return
'ステートメントが例外ハンドラーからのみ終了することを知っています。常にキャッチしたいこの例外のみをキャッチします:)
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.