2012-02-23 26 views
3

コード:DBIからの任意の警告/エラーメッセージを抑制する方法は?

# A: 
$dbh->do(qq/insert into foo(cl) values('test')/); 
# B: 
$dbh->do(qq/insert into foo(cl) values('test')/) or warn $dbh->errstr; 
# C: 
eval { $dbh->do(qq/insert into foo(cl) values('test')/); }; 
warn "error : [email protected] " if [email protected]; 

すべての出力は次のようになります

DBD::mysql::db do failed: Duplicate entry 'test' for key 'cl' at a.pl line 9. 

私はこの任意の警告/エラーメッセージがstderrに送信たくありません。私はwarn $dbh->errstrを使用したいと思います。

perl a.pl 2>/dev/nullエラーメッセージは表示されませんが、スクリプトでこれを行う方法を知りたいですか?

答えて

8

独自のエラーハンドラをインストールする必要があります。例えば。

$dbh->do($statement, { HandleError => \&handle_error }); 

エラーハンドラは、別のオプションがにあるDBI POD

で説明されています

  • 設定PrintWarn属性に偽値(いくつかのフォーラムでシナンの答えの礼儀

  • シグナルハンドラを介してすべての警告をトラップ:$SIG{'__WARN__'} = sub {};

2

DBIハンドルを作成するときにこの頃は、私は通常、次の

  1. は常にRaiseError => 1PrintError => 0を渡します。これですべてのDBI呼び出しにエラーハンドラを追加する必要がなくなりました。私は重複キーエラーに関する無関心だ文の場合
  2. 、キャッチし、その例外を無視:

    use Try::Tiny; 
    try { $dbh->do(...) } 
    catch { die $_ unless /execute failed: Duplicate entry/ }; 
    

これは私が見つけた最良の方法です - INSERT IGNOREだけではなく、すべてのエラーを無視重複したキーエラーが発生し、REPLACEは削除と挿入を使用して既存の行を上書きします。 INSERT INTO ... ON DUPLICATE KEY UPDATE id=idが使用される可能性がありますが、エラーをキャッチする方がより明示的だと思います。

関連する問題