1. ホーム
  2. perl

Try::Tiny は、Perl 5.14 以降の例外処理にまだ推奨されますか?

2023-10-04 13:39:57

質問

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

Perl 5.14 (これは私が使っているバージョンです) は解決するようです。 の問題 eval その Try::Tiny のアドレスになります。ウィル Try::Tiny は、まだ私に何らかの利益をもたらしてくれるのでしょうか?

どのように解決するのですか?

私の答えは不評ですが、Perl プログラマは、Perl で "exceptions" と呼んでいるものの非常に貧弱な概念を使おうとしてはいけないと思います。これらは本質的にサイドチャンネルの戻り値なのです。しかし、例外のアイデアに魅了され、状態を渡すためにグローバル変数を使用するすべての複雑さを考慮しても、人々はそれを動作させようとし続けています。

しかし、実際には、人々は 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 という小さなクラスを作り、戻り値をラップすることで、識別性のない単一の値ではなく、構造化されたデータを持つことができます。戻り値が何を意味するのか、もう迷うことはありません。これは undef は本当の値なのか、それとも失敗を示すものなのか?戻り値は定義されていれば良いのか、それとも真であれば良いのか?これらのことを、あなたのオブジェクトは教えてくれるのです。そして、同じオブジェクトに die . ですでにオブジェクトを使用している場合、そのオブジェクトは die ですでにオブジェクトを使用していて、それを戻り値として使っているのであれば、 このオブジェクトを許容するためにしなければならない余計なことはほとんどありません。 $@ .

これについては 例外を投げる代わりにエラーオブジェクトを返します。

とはいえ、他人のやることはどうしようもないので、やはりPerlには例外があるということにしておく必要がありますね。