Perlコンパイラは、コードに未確認の例外があるかどうかを教えてもらえますか?

StackOverflow https://stackoverflow.com/questions/2727436

質問

PERLには、メソッドがエラーを投げる(または死ぬ)ことができると宣言する方法はありますか?

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

私はいつもJavaで、方法が例外を処理したり、それを投げることができるかをいつも愛していました。メソッドの署名により、「Myexceptionをスロー」することができます。そのため、優れたIDE/コンパイラは、コードのどこかで上記の方法を使用する場合、例外を確認するか、例外をさらに「スロー」するように関数を宣言する必要があることがわかります。 。

Perlで同じようなものを見つけることができません。私の同僚は、誤った入力で「死ぬ」方法を書きましたが、私は評価を忘れています-if($@)それは...ユーザーがアプリケーションを実行している間にのみエラーが発見されました。

(オフコースは、Perlのためにこの種のものを見つけることができる既存のIDEがあるかどうかは疑問ですが、少なくともPerl -CWはできるはずです、いいえ?)

役に立ちましたか?

解決

2つの潜在的な答え。好きな方を選ぶ:

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

  2. どれでも 方法CAN die, 、または少なくとも些細な方法。おそらく何か他のものを呼び出す何かを呼び出すでしょう。そのため、例外が投げかけられないことを保証する唯一の方法は、すべてのレベルの(潜在的な)呼び出しを追跡して、そこに何もないことを確認することです。 die. 。それに応じて、例外が常に可能性とコードであると仮定するだけではるかに実用的です。

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

他のヒント

このようなものは見られませんが、おそらくサブルーチンの属性はあなたの一部を得るかもしれませんか?

ここに小さなものがあります コンセプトの証明 使用 Attribute::Handlers

ThrowSexcectionHandler.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;

example.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

おそらく(の混合物) PPI, Perl::Critic および/または Padre このようなものを使用するように適合させることができますか?

/i3az/

チェックしましたか CPAN? エラー:: trycatch 1つのオプションです、 例外::クラス 別のものなどです。

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

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

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

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

    サブスロー{my $ mess = join( ''、@_); $ MESS = 〜S/ n?$/ n/;私の$ i = 1; local $ "=" '、' ";パッケージdb; $ parts3 "。" $ parts1 ライン$部品2n ";} die $ mess;}

それで、あなたはまたからの参照を取得することもできます」CPAN" と "Perlでのオブジェクト指向の例外処理"

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top