Я новичок в программировании на Perl (и для SO тоже), поэтому мой вопрос может быть сформулирован плохо, но я действительно прочитал много книги и учебники, и я не нашел ничего, что касалось (даже упоминания) моей проблемы.Обработка ошибок в Perl SQLite: выполнение различных действий в соответствии с кодом ошибки
Я пытаюсь использовать DBI и SQLite для написания кода, который повторяет запрос на вставку, если возникает восстановительная ошибка (полная или заблокированная БД и т. Д.), Но умирает, если ошибка невосстановима (DB удалена или повреждена, и т.д.).
Я обнаружил, что интерфейс SQLite C экспортирует коды ошибок:
http://www.sqlite.org/c3ref/c_abort.html
, но я ничего подобного в Perl не найдено. Мне очень жаль, что мне не нужно использовать магические числа в моей первой программе Perl! :-)
Кстати, в документах и примерах, которые я видел в Интернете, очень хорошо объясняется обработка ошибок в автоматическом (т.е. с исключениями) в DBI, но ни один из них не показывает, как выполнять разные действия в соответствии с ошибкой тип. Разве это не обычный случай использования?
Кроме того, все они согласны с тем, что DBI :: err не является правильной переменной, чтобы сообщить, какая ошибка произошла. Они более или менее неявно говорят, что DBI :: errstr должен использоваться, но мне кажется, что немного неудобно полагаться на сравнение строк с ориентированной на человека, возможно, многострочной ошибкой ...
Спасибо за любые предложение!
В большинстве приложений любая ошибка базы данных считается фатальной. – jordanm
[DBI] (http://search.cpan.org/~timb/DBI-1.625/DBI.pm#errstr) говорит обратное: «Метод errstr() не должен использоваться для проверки ошибок, используйте err () для этого, потому что драйверы могут возвращать «успех с информацией» или предупреждающие сообщения через errstr() для методов, которые не «не удались» ». – charlesbridge
@charlesbridge Говорит, что используется err(), чтобы проверить, есть ли ошибка, но не сказать, какая ошибка произошла. Для некоторых драйверов err является -1, что является ошибкой. Это, похоже, неверно для DBD :: SQLite, поэтому мой вопрос: существуют ли символические константы для сравнения err() с? – David