簡體   English   中英

Perl編譯器可以告訴我我的代碼中是否有未經檢查的異常嗎?

[英]Can the Perl compiler tell me if I have an unchecked exception in my code?

在Perl中有一種方法可以聲明方法可以拋出錯誤(或死掉)嗎?

編輯:最讓我感興趣的是讓編譯器或IDE告訴我在我的代碼中某處有未經檢查的異常的方法。

我一直很喜歡Java中的方法,一個方法可以處理異常和/或拋出它。 方法簽名允許放置“拋出MyException”,因此一個好的IDE /編譯器會知道如果你在代碼中的某個地方使用所述方法,你必須檢查Exception或聲明你的函數以“進一步”拋出異常。

我無法在Perl中找到類似的東西。 我的一個同事寫了一個方法,它在錯誤的輸入上“死”,但我忘了eval-if($ @)它...當然,只有在用戶運行應用程序時才會發現錯誤。

(當然我懷疑是否有任何現有的IDE可以為Perl找到這些東西,但至少perl -cw應該能夠,不是嗎?)

兩個可能的答案。 選擇你喜歡的更好:

  1. 在Perl中,這由模塊的POD指示。 無法以編程方式對其進行標記,因此您需要依賴文檔。

  2. 任何方法都可能die ,或至少任何非平凡的方法。 它會調用其他東西,可能會調用其他東西等,所以保證不會拋出異常的唯一方法是追蹤所有級別的(潛在)調用,以驗證那里可能沒有任何可能會die 更加務實,只是假設異常始終是一種可能性和相應的代碼。

編輯補充:作為一般規則,Perl5和靜態代碼分析並沒有真正相處得那么好。 我的理解是,這是Perl6中語言重新設計背后的動機之一,所以你可能會有更好的運氣。

沒有看到這樣的東西,但也許子程序屬性可能會讓你的方式?

這是使用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;

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

也許(混合) PPIPerl::Critic和/或Padre可以適應使用這樣的東西?

/ I3az /

你檢查過CPAN嗎? Error :: TryCatch是一個選項, Exception :: Class是另一個選項,等等。

另外,請參閱Perl中的面向對象異常處理

來自文件“ 例外

  1. $ @沒有告訴我們錯誤發生的位置

  2. 我們可以使用自定義函數來解決這個問題:

    sub throw {my $ mess = join('',@_); $ mess = ~s / \\ n?$ / \\ n /; 我的$ i = 1; local $“=”','“;包DB; while(my @parts = caller($ i ++)){my $ q; $ q =”'“if if @DB :: args; $ mess。=” - > $ parts3“。”at $ parts 1 line $ parts 2 \\ n“;} die $ mess;}

有了它,您還可以從“ CPAN ”和“ Perl中的面向對象的異常處理 ”中獲取引用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM