當查詢失敗時,我需要向數組添加一條錯誤消息。如何收集使用DBI執行語句時發生的錯誤?
這是我執行行:
$txnQuery[$t] = $sth_Data->execute(@argsIn);
我想是這樣的:
$txnQuery[$t] = $sth_Data->execute(@argsIn) or die push(@Error,"SQL Error");
當查詢失敗時,我需要向數組添加一條錯誤消息。如何收集使用DBI執行語句時發生的錯誤?
這是我執行行:
$txnQuery[$t] = $sth_Data->execute(@argsIn);
我想是這樣的:
$txnQuery[$t] = $sth_Data->execute(@argsIn) or die push(@Error,"SQL Error");
的DBI
module提供PrintError
,RaiseError
,並HandleError
選項調整要如何處理錯誤上班。前兩個都只是標誌,但HandleError
可以設置爲一個子程序的參考,讓您精確地要在錯誤
例如的事件發生什麼寫,你可以創建類似的RaiseError
行爲通過書寫
$dbh->{HandleError} = sub {
my ($msg, $dbh, $ret) = @_;
die $msg;
};
或者你可以積累一個錯誤列表,正如你所描述的那樣,只需推入一個數組。像這樣的事情,也許
my @errors;
$dbh->{HandleError} = sub {
my ($msg, $dbh, $ret) = @_;
push @errors, $msg;
};
如果你也想打印到控制檯的消息,那麼你可以warn $msg
您的錯誤處理程序中,也可以簡單地離開PrintError
設置
您可能需要添加一個時間戳每個項目,你推到陣列上,並有可能使用數據庫句柄參數$dbh
和$ret
,這是失敗的返回值方法
謝謝先生,那是行得通的,我正在閱讀其他DBI錯誤管理和'eval'這個句子。 –
@BernadoBorunda:'eval'用於防止終止程序的致命錯誤。所以在這種情況下,你必須設置'RaiseError'來使錯誤成爲致命的,然後使用'eval'來防止你的程序死亡,這似乎有點荒謬。另外,你必須在每個數據庫操作上使用'eval',而爲'HandleError'指定一個子例程只需要完成一次 – Borodin
你正在嘗試,並...發生了什麼?腳本正在死亡? –
打印此錯誤:1在E:\ StatementJSON.pl行395.我認爲或只死在頁面打印,它不能做任何其他行動。 –
您看到的'1'可能是'@ Error'中的元素數量,這是'push'返回的值。不過,我不明白這個問題是什麼。如果你不想讓腳本退出,請不要調用'die'。 –