Проблемы с T-SQL TRY CATCH?

в настоящее время мы работаем над SQL 2005, и я переношу старую систему Foxpro на новое веб-приложение, поддерживаемое SQL Server. Я использую TRY CATCH в T-SQL для обработки транзакций, и, похоже, он работает очень хорошо. Один из других программистов на работе беспокоился об этом, поскольку он сказал, что слышал о проблемах, когда фраза catch не всегда ловила ошибку. Я избил sproc до смерти и не могу заставить его потерпеть неудачу (пропустить улов) , и единственные проблемы, которые я нашел в поиске вокруг сети заключается в том, что он не вернет правильный номер ошибки для номеров ошибок

5 ответов


TRY ... CATCH не ловит все возможные ошибки, но те, которые не пойманы, хорошо документированы в BOL ошибки, не затронутые конструкцией TRY ... CATCH

TRY...CATCH конструкции не ловят следующие условия:

  • предупреждения или информационные сообщения, имеющие серьезность 10 или ниже.
  • ошибки, имеющие серьезность 20 или выше, которые останавливают SQL Server Обработка задачи компонента Database Engine для сессия. Если возникает ошибка, что и тяжести 20 или выше, а соединение с базой данных не прерывается, Попробуйте ... CATCH обработает ошибку.
  • внимания, как запросы клиент-прерывания или сломленный клиентское подключение.
  • когда сеанс завершается системным администратором с помощью KILL заявление.

следующие типы ошибок не обрабатывается блоком CATCH, когда они происходят на одном уровне выполнения как попробовать ... поймать конструкция:

  • ошибки компиляции, такие как синтаксические ошибки, препятствующие пакету бегущий.
  • ошибки, возникающие при перекомпиляции на уровне оператора, такие как ошибки разрешения имен объектов, которые происходят после компиляции из-за отложенное разрешение имен.

эти ошибки возвращаются на уровень который запустил пакет, хранимую процедуру, или триггер.


был один случай в моем опыте, когда попробуйте...Блок catch не перехватывает ошибку. Была связана ошибка с сортировки: Не удается разрешить конфликт параметров сортировки между "Latin1_General_CI_AS" и "Latin1_General_CI_AI" в равно операции. Возможно, эта ошибка соответствует одному из типов ошибок, описанных в BOL.

ошибки, возникающие при перекомпиляции на уровне оператора, например object ошибки разрешения имен, возникающие после компиляции из-за отложенное разрешение имен.


TRY ... CATCH не сможет поймать ошибку, если вы передадите" плохой " поисковый запрос в CONTAINSTABLE

например:

DECLARE @WordList VARCHAR(800)
SET @WordList = 'crap"s'
CON

TAINSTABLE(table, *, @WordList)

на CONTAINSTABLE даст вам "синтаксическую ошибку" и любые окружающие TRY ... CATCH не поймать.

это особенно неприятно, потому что ошибка вызвана данными, а не "реальной" синтаксической ошибкой в вашем коде.


Я работаю в SQL Server 2008. Я построил большой оператор sql, который имел try / catch. Я протестировал его, переименовав таблицу (в dev). Заявление взорвалось и не уловило ошибки. Try / catch в SQL Server слаб, но лучше, чем ничего. Вот часть моего кода. Я не могу больше вкладывать из-за ограничений моей компании.

    COMMIT TRAN T1;
END TRY
BEGIN CATCH
    -- Save the error.
    SET @ErrorNumber = ERROR_NUMBER();
    SET @ErrorMessage = ERROR_MESSAGE();
    SET @ErrorLine = ERROR_LINE();
    -- Put GSR.dbo.BlahBlahTable back the way it was.
    ROLLBACK TRAN T1;   
END CATCH
-- Output a possible error message. Knowing what line the error happened at really helps with debugging.
SELECT @ErrorNumber as ErrorNumber,@ErrorMessage as ErrorMessage,@ErrorLine AS LineNumber;

Я никогда не попадал в ситуацию, когда попробуйте...ПОЙМАТЬ... неудачный. Ни у кого, наверное, есть много людей, которые читают этот вопрос. Это, увы, означает только то, что если есть такая ошибка SQL, то мы ее не видели. Дело в том, что это довольно большое "если". Верьте или нет, Microsoft прилагает некоторые усилия, чтобы сделать свои основные программные продукты довольно прочными, и попробуйте...ПОЙМАТЬ... вряд ли это новая концепция. Быстрый пример: в SQL 2005 я столкнулся с твердой, наглядной и воспроизводимой ошибкой, в то время как разработка затем - новое разделение таблицы-какая ошибка, которая уже была исправлена патчем. И попробуй...ПОЙМАТЬ... используется немного чаще, чем секционирование таблиц.

Я бы сказал, что бремя доказательства ложится на ваш сотрудник. Если он" слышал это где-то", тогда он должен попытаться подтвердить это какими-то доказательствами. Интернет полон доказательств старой поговорки"только потому, что все говорят так, не означает, что они правы".