Интерфейс DBI имеет в своем арсенале мощный и полезный метод trace(), который может пригодиться при отладке неожиданного поведения разработанных сценариев Perl. Этот метод можно использовать для точного отслеживания всех процессов, которые происходят внутри DBD при его работе на различных фазах работы с базой данных. Perl различает девять "уровней" информативности отладочной печати, и первый из них является наименее детализированным.
Листинг 20.27.
#!/usr/bin/perl
# загрузить модуль use DBI();
# соединить
my $dbh = DBI->connect("DBI:mysql:database=somedb;host=localhost", "user", "pass");
# начать отладку $dbh->trace(2);
# выполнить запрос
my $sth = $dbh->prepare("SELECT * FROM mybooks"); $sth->execute();
# просмотр результирующего набора while(my $ref = $sth->fetchrow_hashref())
{
print "Название: $ref->{,title,}nАвтор: $ref->{'author'}nn";
}
# очистить $sth->finish(); $dbh->disconnect();
Вывод трассировки представлен на рис. 20.2.
Внимательное изучение среднего сегмента (рис. 20.2) проясняет причину ошибки в работе сценария: это ошибка в имени таблицы.
Как видно из предыдущего примера, отладочный вывод выводится непосредственно на стандартное устройство вывода. Если этого не нужно делать, можно направить отладочный вывод в файл, задав его имя вторым аргументом метода trace() . Например, следующая строка направит вывод в файл /tmp/error.log.
Трассировка выполнения программы
Точная отладка
Метод trace() может ассоциироваться с дескрипторами, как баз данных, так и операторов. При вызове в качестве метода дескриптора базы данных, метод trace() обеспечивает отладочными сообщениями во время соединения с базой данных. При вызове в качестве метода дескриптора оператора, он трассирует только деятельность, связанную с соответствующим запросом. Эта возможность локализации трассируемых данных по определенному запросу или оператору, позволит получать трассировку по одному из вызовов при наличии в сценарии большого количества вызовов prepare(), execute() и do() .
Отключить отладочную трассировку можно, задав уровень трассировки, равный 0. Листинг 20.29.
$dbh->trace(0);
С точки зрения возможности появления и обработки исключительных ситуаций, ин­терфейс DBI также позволяет задавать большое количество дополнительных атрибутов (в хеше) как необязательный четвертый аргумент метода connect(). Список значений этого атрибута содержится в табл. 20.5.
Среди них одним из наиболее полезных является атрибут RaiseError, позволяющий запрограммировать следующие действия: при возникновении ошибки во время сеанса 
работы с базой данных, Perl активизирует исключительное событие, которое обрабатывается блоком eval(), и немедленно завершить выполнение сценария по команде die(). Этот атрибут вместе в другими перечисленными атрибутами, может использоваться для настройки обработки ошибок как для объектов дескрипторов баз данных, так и объектов дескрипторов операторов.