2010-04-28 76 views
3

Perl中有沒有一種方法可以聲明一個方法可以拋出錯誤(或死)?Perl編譯器能告訴我我的代碼中是否有未經檢查的異常?

編輯:什麼最感興趣我是一個辦法讓編譯器或IDE來告訴我,我在我的代碼有一個未經檢查的異常的地方。

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

我無法在Perl中找到相似的東西。我的一個同事寫了一個方法,在輸入錯誤時「死亡」,但我忘了eval-if($ @)它...... offcourse錯誤只在用戶運行應用程序時發現。

(offcourse我懷疑是否有任何現有的IDE,可以找到這類事情對Perl,但ATLEAST perl的-cw應該是可以的,不是嗎?)

+2

有沒有,不是真的。有近似值和黑客來達到那裏。 – 2010-04-28 07:27:53

+0

這已在幾個問題中進行了討論:http://stackoverflow.com/questions/2439966/do-you-use-an-exception-class-in-your-perl-programs-why-or-why-not(並查看其他人的相關鏈接) – Ether 2010-04-28 14:50:23

回答

3

兩個潛在的答案。選擇你最喜歡的一個:

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

  2. 任何方法可以die,或至少任何非平凡的方法。它會調用其他的東西,這可能會調用其他的東西,等等,所以保證不會拋出異常的唯一方法是跟蹤(潛在)調用的所有級別以確認沒有任何可能的調用die 。假設異常總是可能並相應地編碼,這更加務實。

編輯補充:作爲一般規則,Perl5的和靜態代碼分析真的不一起都得到那麼好。我的理解是,這是Perl6語言重新設計背後的動機之一,所以你可能會有更好的運氣。

+0

感謝您確認沒有(非平凡的)標記它的程式化方式。我正在考慮註釋或類似的問題,但是在2.中的最後一句提供了一個更好的練習,恕我直言 - 一個人不能開始註釋庫中的每一個存在。 – Konerak 2010-04-28 11:43:56

-3

來自文件 「Exceptions

  1. $ @並沒有告訴我們發生錯誤

  2. 我們可以解決這個問題有一個自定義函數:

    子扔我的$ mess = join('',@_);$ mess =〜s/\ n?$/\ n /; my $ i = 1; 本地$ 「=」 ''「; 包DB; 而(我的@parts =呼叫者($ I ++)){ 我的$ Q; $ Q = 」'「 如果@DB :: ARGS; $亂七八糟。= 「 - > $ parts3」 「在$零件1線$部分2 \ n」; } 模$混亂; }

有了,你還可以從 「CPAN」 的引用。和「Object Oriented Exception Handling in Perl

+0

請Please please,爲downvote添加評論。我想知道我誤解了什麼。 – Space 2010-04-28 09:02:40

+2

我不是downvoter,但我懷疑你得到downvoted的原因是OP詢問「如何確定給定的方法的定義的行爲是否包含它可能拋出異常的可能性」,而你的答案不是解決這個問題。 – 2010-04-28 10:22:28

+0

謝謝Dave,非常感謝您的回覆。 – Space 2010-04-28 10:37:06

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; 

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/

+0

好主意,但uuugh。屬性::處理程序。 :)我說,作爲最近在他的CPAN目錄中發佈模塊的人。 – tsee 2010-04-28 15:17:43

相關問題