2017-11-29 30 views
1

RaiseErrorをオフにできるように、スクリプトのいくつかのセクションでPerlのDBI HandleError属性を "オフ"にする方法はありますか?PERL - 特定のセクションでDBI HandleErrorを無効にする

例:

my $dbh = DBI->connect("DBI:SQLite:dbname=file.db","","",{ PrintError => 0, RaiseError => 0, 
                  HandleError => sub{ Log("ERROR: Something failed in db"); exit 1 } }) 
     or die "Couldn't connect"; 

for my $table (@db_tables){ 
    $dbh->do("delete from $table") 
      or do{ Log("ERROR: Delete failed"); next }; 

    Log("Table [$table] content was deleted"); 
} 

exit 0; 

ここで私は、これらのテーブルのいずれかの内容を削除することができなかったという理由だけでのHandleErrorは、スクリプトを殺すためにしたくありません。私は手動でエラーを処理したい。

+0

Try :: Tinyを見て、そのセクションを "try"ブロックに入れることを検討してください。必要に応じて後で独自のエラー処理を追加できます。 – AKHolland

答えて

5

HandleError attributeはいつでも変更できます。 $dbhのハッシュリファレンスに直接アクセスすると、簡単にlocalにすることができます。

for my $table (@db_tables){ 
    local $dbh->{HandleError}; # it's now undef 
    $dbh->do("delete from $table") 
      or do{ Log("ERROR: Delete failed"); next }; 

    Log("Table [$table] content was deleted"); 
} 

より適切な実装は、エラーを適切に処理し、ローカライゼーションを1回だけ設定することです。そのためには、ループの外側にスコープを作成します。

{ 
    local $dbh->{HandleError} = sub { 
     my (undef, $error) = @_ 
     Log("ERROR: Delete failed ($error)"); 
    }; 

    for my $table (@db_tables){ 
     $dbh->do("delete from $table") 
      and Log("Table [$table] content was deleted"); 
    } 
} 

どちらの場合でも、このスコープ内のコードとスコープ内のスコープが実行されている間のみ、値は上書きされます。スコープが終了すると、自動的に復元されます。

+0

優れています。ありがとうございました。 RaiseError属性としてローカライズする必要がありました。 – JohnnyLoo