2010-11-25 61 views
0

我需要知道如何在Perl中自定義我自己的錯誤。舉例來說,這裏的一些代碼:Perl - 自定義錯誤輸出

my $filename = 'filaname1.exe'; 
print "Copying $filename"; 
copy("$dir_root\\$filename", "$spcl_dir\\$filename"); 
if ($? == "0") { 
    print " - Success!\n"; 
} 
else { print " - Failure!\n"; } 

我試着寫這和「catch」錯誤並打印「失敗」時,我沒有得到的退出代碼0,並打印「成功」當我做。我需要知道我可以如何定製這個;我真的不想使用die或類似的東西,它會給(最終用戶)一個有點神祕的錯誤。

謝謝!

+1

在/ path/names中使用/斜槓/不\ \ \\反斜槓\\\\。 – tchrist 2010-11-26 00:15:53

+1

如果`死亡'給出了神祕而難以理解的信息,那麼你就是因爲你正在將這個神祕的論點傳遞給'死亡'。你沒有別的責任。 – tchrist 2010-11-26 00:17:56

+1

這些** **錯誤信息。一個很好的錯誤信息[1]轉到`STDERR` [2]包含`$ 0`,至少遇到錯誤的程序名稱,也許函數名稱;內部錯誤通常也會給出一個堆棧跟蹤[3],包括`$!`,標準系統錯誤信息,或者可能是`$?`或`$ @`,否則[4]表示失敗的系統調用的名稱[5 ]列出你給這個電話的參數。您的信息忽略了這五條良好錯誤信息規則中的全部或幾乎全部。 – tchrist 2010-11-26 00:21:49

回答

4

您需要閱讀$文檔?在perlvar。這個值是:

由過去的管 關閉,反引號返回的狀態( 「``」)命令, 成功調用wait()或 waitpid函數(),或者從系統() 運營商。

你的調用拷貝(大概來自File :: Copy)並沒有深入到任何這些類別中,所以$?沒有設置。

但是,如果您閱讀File::Copy的文檔,您會發現它的功能都是「成功返回1,失敗時返回0」。所以你可以簡化你的代碼。

#!/usr/bin/perl 

use strict; use warnings; 

use File::Copy; 

if (copy('notthere', 'somewhere else')) { 
    warn "success\n"; 
} else { 
    warn "failure: $!\n"; 
} 

請注意,我使用「警告」而不是「打印」,以便錯誤進入STDERR。請注意,還有,使用$!顯示操作系統錯誤。當然,如果它不夠用戶友好,它可以被省略。

1

你使用的是File :: Copy嗎?您必須使用某些東西,因爲copy()不是perl關鍵字或內置函數。

documentation of File::Copy沒有引用$?畢竟,這可能是你的錯誤。你想檢查返回值,並且只有它爲零時,請參閱$ !.

use strict; 
use File::Copy qw(copy); 
my ($from, $to) = @ARGV; 
my $res = copy ($from, $to); 
if($res){ 
    print "Okay\n"; 
} 
else{ 
    print "Not Okay: $!\n"; 
}