2015-12-10 10 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 предоставляющей 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 метода

+0

Спасибо, сэр, thats works, Я читал о других ошибках управления DBI, и предложение eval тоже работает. –

+0

@BernadoBorunda: 'eval' предназначен для предотвращения фатальной ошибки при завершении вашей программы. Поэтому в этом случае вам придется установить 'RaiseError', чтобы сделать ошибки фатальными, а затем использовать' eval', чтобы ваша программа не умирала, что кажется немного бессмысленным. Кроме того, вы должны использовать операцию 'eval' on * every * database, тогда как назначение подпрограммы' HandleError' должно выполняться только один раз – Borodin