TRY/CATCH. Один оператор - несколько ошибок

_d_m_ (настоящий)
Дата: 28.01.2009 12:45:21
MS SQL 2005 SP3.

Всем здоровья!

Заворачиваем оператор BACKUP LOG в конструкцию TRY/CATCH. При ошибке, видать оператор выдает их несколько. Поэтому в блоке CATCH ф-циями ERROR_MESSAGE() и прочими видим только последнюю и бесполезную: "Message: BACKUP LOG is terminating abnormally." Возможно ли вытащить все предыдущие ошибки сгенерированные BACKUP LOG?
EvAlex
Дата: 28.01.2009 12:53:37
Ну как вариант - запустить без try... catch посмотреть все ошибки и исправить что-надо?
_d_m_ (настоящий)
Дата: 29.01.2009 04:44:45
EvAlex,

Нет не вариант. Бэкапы делаются автоматически. В штатном режиме: БД в full recovery model, редко - полный бекап, часто - бэкап журналов.
При неудаче сделать бэкап журнала, делается попытка сделать полный бэкап.

То, что мы неможем вытащить всю инфу об ошибке в блоке CATCH есть косяк дизайна MS SQL.
Glory
Дата: 29.01.2009 10:33:49
_d_m_ (настоящий)
EvAlex,

Нет не вариант. Бэкапы делаются автоматически. В штатном режиме: БД в full recovery model, редко - полный бекап, часто - бэкап журналов.
При неудаче сделать бэкап журнала, делается попытка сделать полный бэкап.

То, что мы неможем вытащить всю инфу об ошибке в блоке CATCH есть косяк дизайна MS SQL.

ERROR_MESSAGE() возвращает ту ошибку, но которую _сработал_ TRY/CATCH
Где и какие еще _серверные ошибки_ вы видите ?
locky
Дата: 29.01.2009 11:00:14
Емнип, в своем блоге один из разработчиков try/catch обсуждал эту ситуацию, когда по одной ошибке выскакивает несколько сообщений, и написал, мол - мы не можем поймать все сообщения, поэтому показываем последнее.
Хотя, имхо, могли бы сделать ERROR_MESSAGE етк параметризованным - и дать возможность посмотреть на весь список сообщений.

-------------------------
There’s no silver bullet!
_d_m_ (настоящий)
Дата: 29.01.2009 11:33:57
locky,

Скорее не "не можем", а "не хотим, не считаем нужным реализовывать". Жаль.
_d_m_ (настоящий)
Дата: 29.01.2009 11:39:44
Glory
ERROR_MESSAGE() возвращает ту ошибку, но которую _сработал_ TRY/CATCH
Где и какие еще _серверные ошибки_ вы видите ?


Без try/catch:
Msg 4208, Level 16, State 1, Procedure рег_РезервноеКопирование, Line 41
The statement BACKUP LOG is not allowed while the recovery model is SIMPLE. Use BACKUP DATABASE or change the recovery model using ALTER DATABASE.
Msg 3013, Level 16, State 1, Procedure рег_РезервноеКопирование, Line 41
BACKUP LOG is terminating abnormally.


Иначе:
Error 3013, Level 16, State 1, Procedure рег_РезервноеКопирование, Line 41, Message: BACKUP LOG is terminating abnormally.


Еще вопросы?
alexeyvg
Дата: 29.01.2009 12:10:10
[quot locky]Хотя, имхо, могли бы сделать ERROR_MESSAGE етк параметризованным - и дать возможность посмотреть на весь список сообщений./quot]Да, try/catch у мс не очень удобный, ещё, в частности, нельзя неверх ошибку послать...

Нужно просто при проектировании системы это учитывать и try/catch не использовать - обработка ошибок только на клиенте, а в процедурах просто проверка @@error и необходимая обработка типа отката транзакции и выход.
_d_m_ (настоящий)
Дата: 29.01.2009 14:05:38
alexeyvg,

Не вариант. А, например, пару sp_xml_preparedocument/sp_xml_removedocument как обрабатывать? Не все так просто...
locky
Дата: 29.01.2009 14:18:52
alexeyvg
Нужно просто при проектировании системы это учитывать и try/catch не использовать - обработка ошибок только на клиенте, а в процедурах просто проверка @@error и необходимая обработка типа отката транзакции и выход.

В этом случае возникает один простой вопрос - а нафига тогда вводили try/catch, если его не использовать?
И с рерайзингом ошибок приходится финты ушами делать....