1

制限付き(root権限が必要な場合)でファイルを開くときに発生するエラーを処理するために、単純なコードスニペットを作成しました。次のコードは正常に機能し、o/pとしてエラーが発生します。

#!/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 : $@ \n";

$_または$@に出力が表示されないのに、なぜこれが起こっているのでしょうか。

4

2 に答える 2

4

openは、失敗しても例外をスローせず、false値を返し、エラーはに格納され$!ます。したがって、一般的な使用法は

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以降では、この詳細なコードの代わりにgivenとを使用できます。when詳細については、autodieのドキュメントを参照してください。

于 2013-03-01T13:03:31.523 に答える
1

操作の失敗とエラーには違いがあります。

存在しないファイル(またはその他)を開こうとすると、open関数はファイルを開くことができません。しかし、それはにエラーがあったという意味ではありませんopenopen意図したとおりに動作しました。ファイルを開くことができなかった場合にfalse値を返します。

eval BLOCKエラーtry...catchキャッチするためのものです—コードが意図したとおりに実行できなかった場合。

ファイルを開かない場合は、コードに関するエラーである可能性があります。特定のファイルを開くことができない場合、コードが意図したとおりに実行されない可能性があります。その場合、これを処理してエラーを出力することができます。

于 2013-03-01T13:12:38.063 に答える