2

[編集] - 後知恵の恩恵により、この質問は誤った方向に向けられました。Perl::Criticによるeval の誤った使用と正しい批評の良い例であるため、削除していません。

Perl Critic は、以下のコードに対して次のような批判を提起しています。

テストされていない eval の戻り値。の値に依存して$@/$EVAL_ERROR、評価が失敗したかどうかを判断することはできません

my $Jet = Win32::OLE->CreateObject('DAO.DBEngine.36')
    or croak "Can't create Jet database engine.";
my $DB = $Jet->OpenDatabase($DBFile)

# code omitted for the sake of brevity
# perl script writes results to Access db via an append query
$DB->Execute( $SQLquery, 128 );                       #128=DBFailOnError

eval {$err = Win32::OLE->LastError()} ; #<<<< PROBLEM LINE SEE FEEDBACK BELOW  
if ( $err){
     print $ERROR "WIN32::OLE raised an exception: $err\n";
     Win32::OLE->LastError(0);  # this clears your error
}

私の考えではeval、エラーオブジェクトの存在を検出し、Win32:OLEモジュールでエラーを検出して報告するために使用しています。

批判を無視しても安全ですか?

4

2 に答える 2

3

問題はさておきperl-critic、あなたのコードはあまり意味がありません。

Win32::OLEのドキュメントでは、例外がスローされるタイミング (および例外を自動的にキャッチする方法) について説明しています。

LastErrorプログラムが停止していないと仮定して、エラーが発生した後にエラーに関する情報を提供するだけです。包み込むのevalは無意味です。

更新:次の行に沿って何かを書いたはずです (現在、Windows にアクセスできない Linux を使用しているため、テストされていません)。

use strict;
use warnings;

use Carp;

use Win32;
use Win32::OLE;

$Win32::OLE::Warn = 3;

# No need for this eval if you are OK with the default error message    
my $Jet = eval {
    Win32::OLE->CreateObject('DAO.DBEngine.36')
} or croak sprintf(
    "Can't create Jet database engine: %s", 
    win32_error_message(Win32::OLE->LastError)
);

# No need for this eval if you are OK with the default error message
my $DB = eval {
    $Jet->OpenDatabase($DBFile)
} or croak sprintf(
    "Can't open database '$DBFile': %s",
    win32_error_message(Win32::OLE->LastError)
);

my $result = eval {
    $DB->Execute( $SQLquery, 128 )
};

unless (defined $result) {
    print $ERROR win32_error_message(Win32::OLE->LastError);
    Win32::OLE->LastError(0);
}
于 2009-10-16T13:05:22.867 に答える