2013-04-30 2 views
4


Я новичок в программировании на Perl (и для SO тоже), поэтому мой вопрос может быть сформулирован плохо, но я действительно прочитал много книги и учебники, и я не нашел ничего, что касалось (даже упоминания) моей проблемы.Обработка ошибок в Perl SQLite: выполнение различных действий в соответствии с кодом ошибки

Я пытаюсь использовать DBI и SQLite для написания кода, который повторяет запрос на вставку, если возникает восстановительная ошибка (полная или заблокированная БД и т. Д.), Но умирает, если ошибка невосстановима (DB удалена или повреждена, и т.д.).

Я обнаружил, что интерфейс SQLite C экспортирует коды ошибок:

http://www.sqlite.org/c3ref/c_abort.html

, но я ничего подобного в Perl не найдено. Мне очень жаль, что мне не нужно использовать магические числа в моей первой программе Perl! :-)

Кстати, в документах и ​​примерах, которые я видел в Интернете, очень хорошо объясняется обработка ошибок в автоматическом (т.е. с исключениями) в DBI, но ни один из них не показывает, как выполнять разные действия в соответствии с ошибкой тип. Разве это не обычный случай использования?
Кроме того, все они согласны с тем, что DBI :: err не является правильной переменной, чтобы сообщить, какая ошибка произошла. Они более или менее неявно говорят, что DBI :: errstr должен использоваться, но мне кажется, что немного неудобно полагаться на сравнение строк с ориентированной на человека, возможно, многострочной ошибкой ...

Спасибо за любые предложение!

+0

В большинстве приложений любая ошибка базы данных считается фатальной. – jordanm

+0

[DBI] (http://search.cpan.org/~timb/DBI-1.625/DBI.pm#errstr) говорит обратное: «Метод errstr() не должен использоваться для проверки ошибок, используйте err () для этого, потому что драйверы могут возвращать «успех с информацией» или предупреждающие сообщения через errstr() для методов, которые не «не удались» ». – charlesbridge

+0

@charlesbridge Говорит, что используется err(), чтобы проверить, есть ли ошибка, но не сказать, какая ошибка произошла. Для некоторых драйверов err является -1, что является ошибкой. Это, похоже, неверно для DBD :: SQLite, поэтому мой вопрос: существуют ли символические константы для сравнения err() с? – David

ответ

1

Моя работа с DBI почти всегда была с mysql вместо sqlite3, поэтому я не могу говорить из непосредственного опыта. Однако, не чувствуйте себя слишком плохо, если вы абсолютно должны проверить магические строки и цифры. Главное, как вы это делаете. Всякий раз, когда вам приходится полагаться на магические строки и/или цифры, поместите их в константу или хэш в части конфигурации вашего скрипта (или, возможно, даже в файле конфигурации).

Плохая вещь о магических числах/строках состоит в том, что им трудно управлять, если они меняются, или никто не помнит, что генерирует это условие, и т. Д. Но это смягчается, если вы делаете это правильно и документируете.

BTW - если вы только начинаете, я настоятельно рекомендую прочитать Дамиана Конвей, «Perl Best Practices». Я проверил, и он не обращается к обработке магических строк/чисел, но это все же лучшая книга, которую я прочитал на Perl. После того, как вы пройдете через PBP, взгляните на Perl Critic - это прекрасный инструмент, который заставит вас плакать. Он будет указывать магические строки и многие и многое другое :)

+0

Спасибо за указатели документации! – David