2013-03-01 35 views
1

我編寫了簡單的代碼片段,用於處理在受限制的(我們需要root權限的情況下)打開文件時發生的錯誤 以下代碼工作正常並且出現錯誤作爲O/p在perl中打開文件時使用try/catch或eval進行錯誤處理

#!/usr/bin/perl 

use strict; 
use warnings; 
use Try::Tiny; 

my $file_name = "/var/log/test.txt"; # needs root permission to create file 

if(open(HAN, ">$file_name")){ 
    print "sucuessfully opened file \n "; 
} else { 
    print "Error with if/else while openning file : $! \n"; 
} 

O/p:

誤差的if/else在打開文件:權限被拒絕

當我使用try/catch語句或EVAL具有相同的代碼,並打開文件

try { 
    open(HAN, ">$file_name"); 
} catch { 
    print "Error with try/catch while opening file : $_ \n"; 
}; 

eval { 
    open(HAN, ">$file_name"); 
}; 
print " Error with eval while opening file : [email protected] \n"; 

它顯示在$無輸出_或$ @,這是爲什麼happing?

+0

總是把'使用警告' – 2013-03-01 13:01:43

+1

通常使用的語法是使用open()或死「$!」; – run 2013-03-01 13:06:21

+0

@ run-thanks,我知道我們可以使用「$!」對於open(),但試圖探索用try..catch或eval來做到這一點。 – Ganesh 2013-03-01 13:50:57

回答

3

open如果失敗則不會拋出異常,它將返回一個假值並將錯誤存儲在$!中。因此,典型的用法是

open my $fh, '>', $filename or die "Couldn't open '$filename' for writing: $!"; 

如果你有大量的I/O代碼,或者其他的東西,可能會拋出異常,你可能更喜歡比open(和其他I/O功能)自動扔在一個錯誤失敗。你可以用autodie做到這一點:除了

use autodie qw(:io); 

由於@sputnick提到,你應該use warnings;use strict;

最後,這裏只是受涼I/O異常的例子:

use warnings; 
use strict; 
use autodie qw(:io); 
use Try::Tiny; 

try { 
    open my $fh, '>', $filename; 
    ... more code ... 
} 
catch { 
    if ($_->isa('autodie::exception') && $_->matches(':io')) { 
     print "Error doing something with '$filename': $_\n"; 
    } 
    else { 
     die $_; # rethrow 
    } 
}; 

在Perl 5.10+上,您可以使用givenwhen代替這個冗長的代碼;請參閱autodie docs瞭解更多信息。

+0

@ rjh-感謝您的詳細解釋。 – Ganesh 2013-03-01 13:47:53

+0

+1表示'autodie'可能會做他所期望的。 – darch 2013-03-02 00:36:49

1

操作失敗與錯誤之間存在差異。

當您嘗試打開不存在的文件(或其他)時,open函數未能成功打開該文件。但這並不意味着在open中有錯誤。 open的行爲與它的意圖完全相同:無法打開文件時返回錯誤值。

eval BLOCKtry...catch用於捕獲錯誤 - 代碼無法按預期執行時的情況。

未能打開文件可能是您的代碼相對於的錯誤 - 如果您無法打開某個文件,您的代碼可能無法按預期執行。在這種情況下,你可以處理這個並輸出一個錯誤。

相關問題