3

Perl で、メソッドがエラーをスロー (または終了) できることを宣言する方法はありますか?

編集:私が最も興味を持っているのは、コードのどこかにチェックされていない例外があることをコンパイラまたは IDE に通知させる方法です。

Java では、メソッドが例外を処理したりスローしたりする方法が大好きでした。メソッドの署名により、「myException をスロー」することができるため、優れた IDE/コンパイラは、コードのどこかでこのメソッドを使用する場合、例外をチェックするか、例外をさらに「スロー」するように関数を宣言する必要があることを認識します。 .

Perl で同様のものを見つけることができません。私の同僚は、間違った入力で「死ぬ」メソッドを書きましたが、eval-if($@) するのを忘れています...もちろん、ユーザーがアプリケーションを実行しているときにのみエラーが発見されました。

(もちろん、Perl でこの種のものを見つけることができる既存の IDE があるかどうかは疑問ですが、少なくとも perl -cw でできるはずですよね?)

4

4 に答える 4

3

2つの潜在的な答え。好きな方を選んでください:

  1. Perl では、これはモジュールの POD によって示されます。プログラムでマークする方法がないため、代わりにドキュメントに頼る必要があります。

  2. どのメソッドでもdie、または少なくとも重要なメソッドを実行できます。おそらく何か他のものを呼び出すなど、他の何かを呼び出すので、例外がスローされないことを保証する唯一の方法は、(潜在的な) 呼び出しのすべてのレベルをトレースして、そこに何もないことを確認することdieです。例外は常に可能性があると想定し、それに応じてコーディングする方がはるかに実用的です。

追加するために編集:一般的な規則として、Perl5 と静的コード分析は実際にはそれほどうまくいきません。私の理解では、これが Perl6 での言語の再設計の背後にある動機の 1 つであるため、運が良いかもしれません。

于 2010-04-28T10:28:10.713 に答える
2

このようなものは見られませんでしたが、おそらくサブルーチン属性があなたの役割を果たしているのではないでしょうか?

これは、使用した概念の小さな証明ですAttribute::Handlers

ThrowsExceptionHandler.pm

package ThrowsExceptionHandler;
use Modern::Perl;
use Attribute::Handlers;

our @subs;

sub ThrowsException :ATTR(CODE) {
    push @subs, {
        package  => $_[0],
        symbol   => $_[1],
        subname  => *{$_[1]}{NAME},
        referent => $_[2],
        attr     => $_[3],
        data     => $_[4],
        phase    => $_[5],
        filename => $_[6],
        linenum  => $_[7],
    };
}

sub does_throw {
    my ($class, $subname) = @_;
    (grep { $_->{subname} eq $subname } @subs) ? 1 : 0;
}

1;

たとえば .pl

use Modern::Perl;
use base qw(ThrowsExceptionHandler);

sub baz :ThrowsException {
    die "Throws error";
}

sub foo {
    warn "warning only";
}


say ThrowsExceptionHandler->does_throw( 'baz' );  # => 1
say ThrowsExceptionHandler->does_throw( 'foo' );  # => 0

おそらく(の混合物)PPIPerl::Criticおよび/またはPadreこのようなものを使用するように適応できますか?

/I3az/

于 2010-04-28T12:06:53.637 に答える
-2

CPANをチェックしましたか?Error::TryCatchは 1 つのオプション、Exception::Classは別のオプションなどです。

また、Perl でのオブジェクト指向の例外処理も参照してください。

于 2010-04-28T07:24:12.257 に答える
-3

ドキュメント「例外」から

  1. $@ はエラーが発生した場所を教えてくれません

  2. カスタム関数でこれを回避できます。

    sub throw { my $mess = join('', @_); $mess =~ s/\n?$/\n/; 私の $i = 1; local $" = "', '"; package DB; while (my @parts = caller($i++)) { my $q; $q = "'" if @DB::args; $mess .= " -> $parts3" . " at $parts 1 line $parts 2 \n"; } die $mess; }

これにより、「 CPAN」および「Perl におけるオブジェクト指向の例外処理」からも参照できます。

于 2010-04-28T07:21:47.700 に答える