代码之家  ›  专栏  ›  技术社区  ›  Konerak

Perl编译器能告诉我代码中是否有未检查的异常吗?

  •  3
  • Konerak  · 技术社区  · 16 年前

    我一直很喜欢在Java中,方法如何处理异常和/或抛出异常。方法签名允许放置“throws MyException”,因此一个好的IDE/编译器会知道,如果在代码中的某个地方使用该方法,则必须检查异常或声明函数以进一步“抛出”异常。

    我在Perl中找不到类似的东西。我的一个同事写了一个方法,它在输入错误时“死亡”,但我忘记了评估($@)它是否。。。当然,只有在用户运行应用程序时才发现错误。

    (当然,我怀疑是否有任何现有的IDE可以为Perl找到这类东西,但至少Perl-cw应该能够找到,不是吗?)

    4 回复  |  直到 16 年前
        1
  •  3
  •   Dave Sherohman    16 年前

    1. 在Perl中,这由模块的POD表示。无法以编程方式标记它,因此需要依赖文档。

    2. 方法can die ,或者至少是任何非平凡的方法。它将调用其他的东西,可能会调用其他的东西,等等,所以保证不会抛出异常的唯一方法是跟踪所有级别的(潜在的)调用,以验证那里没有可能引发异常的东西 死亡 . 更实际的做法是假设例外总是可能的,并相应地编写代码。

    编辑以添加: 一般来说,Perl5和静态代码分析并不能很好地相处。我的理解是,这是Perl6语言重新设计背后的动机之一,所以你在那里可能会有更好的运气。

        2
  •  2
  •   Community Mohan Dere    6 年前

    没有见过这样的东西,但也许子程序属性可以得到你的一部分的方式?

    这是一个小房间 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;
    

    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公司/

        3
  •  -2
  •   Pedro Silva    16 年前
        4
  •  -3
  •   Boris Callens    16 年前

    “来自文档” Exceptions "

    1. 我们可以通过一个自定义函数来解决这个问题:

      分抛{ my$mess=join(“”,@); $mess=~s/\n?$/\n/; 我的$i=1; 包DB; while(my@parts=caller($i++){ 我的$q$q=“”,如果@DB::args; “在$parts 1 行$部件 2 \n“; 死$乱; }

    你也可以从 CPAN “和” Object Oriented Exception Handling in Perl