2015-12-10 29 views
-2

當查詢失敗時,我需要向數組添加一條錯誤消息。如何收集使用DBI執行語句時發生的錯誤?

這是我執行行:

$txnQuery[$t] = $sth_Data->execute(@argsIn); 

我想是這樣的:

$txnQuery[$t] = $sth_Data->execute(@argsIn) or die push(@Error,"SQL Error"); 
+0

你正在嘗試,並...發生了什麼?腳本正在死亡? –

+0

打印此錯誤:1在E:\ StatementJSON.pl行395.我認爲或只死在頁面打印,它不能做任何其他行動。 –

+0

您看到的'1'可能是'@ Error'中的元素數量,這是'push'返回的值。不過,我不明白這個問題是什麼。如果你不想讓腳本退出,請不要調用'die'。 –

回答

3

DBI module提供PrintErrorRaiseError,並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,這是失敗的返回值方法

+0

謝謝先生,那是行得通的,我正在閱讀其他DBI錯誤管理和'eval'這個句子。 –

+0

@BernadoBorunda:'eval'用於防止終止程序的致命錯誤。所以在這種情況下,你必須設置'RaiseError'來使錯誤成爲致命的,然後使用'eval'來防止你的程序死亡,這似乎有點荒謬。另外,你必須在每個數據庫操作上使用'eval',而爲'HandleError'指定一個子例程只需要完成一次 – Borodin

相關問題