![](/img/trans.png)
[英]How can I tell why my Perl code is spending so much time in kernel space (“sy” in top)?
[英]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應該能夠,不是嗎?)
兩個可能的答案。 選擇你喜歡的更好:
在Perl中,這由模塊的POD指示。 無法以編程方式對其進行標記,因此您需要依賴文檔。
任何方法都可能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
也許(混合) PPI
, Perl::Critic
和/或Padre
可以適應使用這樣的東西?
/ I3az /
你檢查過CPAN嗎? Error :: TryCatch是一個選項, Exception :: Class是另一個選項,等等。
另外,請參閱Perl中的面向對象異常處理 。
來自文件“ 例外 ”
$ @沒有告訴我們錯誤發生的位置
我們可以使用自定義函數來解決這個問題:
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.