2012-04-26 72 views
23

我發現存在模塊Error,它提供了像java一樣的try和catch功能。但我很困惑你如何能夠打印返回的異常。如何正確使用perl中的try catch,error.pm提供了?

我想了解如何執行以下

try { 
    // do something that will fail! 

} catch (Error e) { 
    // Print out the exception that occurred 
    System.out.println(e.getMessage()); 
} 

如何得到錯誤與堆棧跟蹤打印?

回答

40

你可能會更好使用Try::Tiny這將幫助您避免pitfalls with older perls的數量。

use Try::Tiny; 

try { 
     die "foo"; 
} catch { 
     warn "caught error: $_"; 
}; 
+0

如何將這個警告轉儲到日誌? – pitchblack408 2012-04-29 22:30:59

+0

我可以創建異常嗎? – pitchblack408 2012-05-08 00:28:06

+1

我不確定你在問什麼。通過記錄日誌文件將日誌文件轉儲,並使用'die'或'croak'創建異常。你問如何把異常對象等放在一起?這將是一個單獨的問題。 – 2012-05-08 00:41:12

36

最後我檢查了Error已被棄用。但在這裏,你會怎麼做,而不該模塊:

eval { 
    die "Oops!"; 
    1; 
} or do { 
    my $e = [email protected]; 
    print("Something went wrong: $e\n"); 
}; 

基本上,使用eval代替trydie代替throw,並尋找[email protected]例外。 eval塊末尾的真值是避免[email protected]在5.14以前的Perl版本中再次使用之前無意中更改的成語的一部分,有關詳細信息,請參閱P::C::P::ErrorHandling::RequireCheckingReturnValueOfEval。例如,此代碼遭受此缺陷。

# BAD, DO NOT USE WITH PERLS OLDER THAN 5.14 
eval { 
    die "Oops!"; 
}; 
if (my $e = [email protected]) { 
    print("Something went wrong: $e\n"); 
} 
# BAD, DO NOT USE WITH PERLS OLDER THAN 5.14 

但是請注意,當他們失敗很多Perl的操作不會引發異常;他們只是返回一個錯誤代碼。對於內置模塊和標準模塊,可以通過autodie更改此行爲。如果您使用autodie,然後做的try/catch的標準方式是這樣的(直出autodie的perldoc的):

use feature qw(switch); 

eval { 
    use autodie; 

    open(my $fh, '<', $some_file); 

    my @records = <$fh>; 

    # Do things with @records... 

    close($fh); 

}; 

given ([email protected]) { 
    when (undef) { say "No error";     } 
    when ('open') { say "Error from open";    } 
    when (':io') { say "Non-open, IO error.";   } 
    when (':all') { say "All other autodie errors." } 
    default  { say "Not an autodie error at all." } 
} 

爲了得到一個堆棧跟蹤,看看Carp

+0

請參閱[Try :: Tiny'文檔中的背景部分](http://search.cpan.org/perldoc/Try::Tiny#BACKGROUND),以瞭解可能會遇到的問題,您可以使用較早的'perl's使用'eval'進行異常處理。 – 2012-04-27 00:55:21

+0

[異常處理在5.14.0中修復](http://search.cpan.org/perldoc/perl5140delta#Exception_Handling) – 2012-04-27 01:45:57

+0

我是perl的新手,我該如何找出不贊成使用的內容?我不想使用eval {因爲它不自然。我來自java/C++/C#背景。那麼,如果我轉向更新更穩定的Try :: Tiny? – pitchblack408 2012-04-28 06:38:17

5

如果你想要的東西有點不是試圖::微小的功能更強大,你可能想嘗試尋找在CPAN的TryCatch模塊。