|
Программирование >> Программный интерфейс приложений
Переменные $DBI::err и $DBI: : errstr, которые используются в только что показанном вызове метода die (), нужны для создания диагностических сообщений. Они содержат коды и тексты ощибок СУБД MySQL, совсем как функции интерфейса С API mysql errno () и mysql error(). Если есть намерение возложить обработку всех ошибочных ситуаций на интерфейс DBI, чтобы не проверять их самому, достаточно разблокировать параметр RaiseError: $dbh = DBI->connect ($dsn, $user name, $password, ( RaiseError => 1 }) ; Этот подход значительно проще и он применен в сценарии dumpmembers. При необходимости проводить некие операции очистки памяти при выходе по ощибке актуализация параметра RaiseError подходит не совсем, но и в этом случае остается возможность сделать все, что требуется. Для этого достаточно переопределить дескриптор $SIG{ DIE }. Кроме того, желание избежать разблокировки параметра RaiseError может диктоваться тем, что интерфейс DBI распечатывает в своих диагностических сообщениях только диагностическую информацию: disconnect(DBI::db=HASH(0xl97aae4)) invalidates 1 active statement. Either destroy statement handles or call finish on them before disconnecting. Отключение{ОВ1::db=HASH(0xl97aae4)) делает недействительным 1 активный оператор. Удалите дескриптор оператора или завершите его работу перед отключением. Эта информация понятна программисту, но такую информацию вряд ли стоит показывать обычному пользователю. В этом случае лучще сделать проверку на ошибки самому и формировать более понятные сообщения для пользователей данного сценария. Кроме того, в качестве альтернативного метода здесь можно рассмотреть возможность переопределения дескриптора $SIG{ DIE }. Это может упростить программирование обработки ошибочных ситуаций потому, что позволит воспользоваться возможностями параметра RaiseError, заменив при этом обычные сообщения интерфейса DBI своими собственными сообщениями. Для того чтобы создать свой собственный дескриптор DIE , до вызова DBI сделайте что-то наподобие следующего: $SIG{ DIE } = sub { die Извините, обнаружена ошибкаХп ; }; Подпрограмму можно объявить обычным образом и установить значение дескриптора с помощью обращения к подпрограмме: sub die handler { die Извините, обнаружена ошибка\п ; $SIG{ DIE } = \5,die handler; в качестве альтернативы передаче атрибутов обработки ошибок методу connect О литеральным образом можно определить их с помошью хэша и передавать уже только ссылку на хэш. Есть мнение, что такие установки атрибутов делают сценарии более читаемыми и редактируемыми, но функционально оба подхода идентичны. Вот пример использования хэша атрибутов. %attr = { PrintError => О, RaiseError => О $dbh = DBI->connect ($dsn, $user name, $password, \%attr) or die Невозможно подключиться к серверу: $DBI::err ($DBI::errstr)\n ; Вот сценарий dump members2, иллюстрируюший возможность создания сценария, в котором запрофаммирована обработка ошибок, и печати своих собственных сообшений. Сценарий dump members2 обрабатывает тот же запрос, что и сценарий dumpmembers, но явным образом блокирует работу парамефов PrintError и RaiseError, а затем блокирует результат каждого обрашения к интерфейсу DBI. При возникновении ошибок сценарий перед выходом вызывает подпрофамму bail out (), которая выводит сообшение и содержимое переменных $DBI: :err и $DBI: :: #1 /usr/bm/perl # dump members2 - список членов Исторической Лиги use DBI; use strict; my ($dsn) = DBI:mysql:samp db:localhost ; # наименование источника данных my ($user name) = paul ; # имя пользователя my ($password) = secret ; # пароль my ($dbh, $sth) ; # дескрипторы базы данных и операторов my (@ary); # массив строк, возвращаемых запросом ту (%attr) = # атрибуты обработки ошибок PrintError => О, RaiseError => О # подключение к базе данных $dbh = DBI->connect ($dsn, $user name, $password, \%attr) or bail out ( Невозможно подключиться к базе данных ); # создать запрос $sth = $dbh->prepare ( SELECT last name, first name, suffix, email, . street, city, state, zip, phone FROM member ORDER BY last name ) or bail out ( Невозможно создать запрос ); $sth->execute () or bail out ( Невозможно выполнить запрос ); # прочесть результаты запросов и очистить while ((Загу = Ssth->fetchrow array О) print join ( \t , @ary), \n ; SDBI::err == 0 or bail out ( Bo время выборки произошла ошибка ); # очистить память Ssth->finish () or bail out ( Невозможно завершить выполнение запроса ); Sdbh->disconnect () or bail out ( Невозможно отключиться от базы данных ); exit (0); # подпрограмма bail out()- распечатать код и сообщение об ошибке, а затем завершить выполнение sub bail out ( - 40qn г, my ($message) <Hj:S itft; die $meja\nError SDBI::err ($DBI:: errstr) \n ; Подпрограмма ,bail out 0 аналогична функции print error (), которая использовалась в главе 6, Профаммный интерфейс MySQL С API , за одним исключением: подпрофамма bail out() завершает выполнение сценария, а не возвращает управление вызывающей профамме. Подпрофамма bail out () освобождает от необходимости работы с переменными $DBl::errH$DBl::errstr ВСЯКИЙ раз, когда есть необходимость напечатать диагностическое сообщение. Обработка диагностических сообщений в одной подпро1рамме позволяет при необходимости менять формат диагностического сообщения во всем сценарии простым изменением в одном месте, в подпрофамме. Сценарий dump members2 делает проверку сразу же после цикла выборки сфок, чего нет в сценарии dumpmembers. Поскольку сценарий durap members2 не автоматически завершает работу при возникновении ошибки в fetchrowarray (), он в праве определить, завершил ли свою работу цикл из-за того, что результирующий набор был выбран полностью (нормальное завершение) или из-за возникновения ошибки. Работа цикла завершается в любом случае, но при возникновении ошибки вывод будет сделан в усеченном виде. В случае отсутствия проверки на ошибку пользователь не будет знать того, что что-то было не так! Если сценарий профаммируется таким образом, что проверка ошибочных ситуаций производится вручную , обязательно проверяйте результаты выборки.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |