Упровадження структурованої обробки винятків

Завершено

Тепер, коли ви маєте розуміння характеру помилок і основної обробки помилок у T-SQL, настав час переглянути більш розширену форму обробки помилок. Структурована обробка винятків була введена в SQL Server 2005.

Тут ви дізнаєтеся, як використовувати його та оцінити його переваги та обмеження, зокрема блок TRY CATCH, роль функцій обробки помилок і розуміння різниці між помітними та непридатними помилками. Нарешті, ви побачите, як можна керувати та відображати помилки, коли це необхідно.

Що таке програмування блокування TRY/CATCH

Структурована обробка винятків потужніша, ніж обробка помилок на основі системної змінної @@ERROR. Це дає змогу запобігти заваленню коду кодом обробки помилок і централізувати цей код обробки помилок. Централізація коду обробки помилок також означає, що ви можете зосередитися більше на меті коду, а не на обробці помилок, які він містить.

Блок TRY і блокування CATCH

Під час використання структурованої обробки винятків код, який може викликати помилку, розміщується в блоці TRY. Блоки TRY взято операторами BEGIN TRY і END TRY .

Якщо станеться помітна помилка – більшість помилок може бути спіймано, елемент керування виконанням переміщується до блоку CATCH. Блок CATCH – це серія операторів T-SQL, взятих операторами BEGIN CATCH і END CATCH .

Примітка

Хоча BEGIN CATCH і END TRY є окремими операторами, BEGIN CATCH має негайно слідувати END TRY.

Поточні обмеження

Мови високого рівня часто пропонують спробувати/зловити / нарешті побудувати, і часто використовуються для випуску ресурсів неявно. У T-SQL немає еквівалентного блоку FINALLY.

Розуміння різниці між помітними та непридатними для пошуку помилками

Важливо розуміти, що, хоча блоки TRY/CATCH дають змогу виявити набагато ширший діапазон помилок, ніж @@ERROR, ви не можете зловити кожен тип.

Помітні та невиявлювані помилки

Не всі помилки можуть бути спіймані блоками TRY/CATCH в межах тієї самої області, де існує блок TRY/CATCH. Часто помилки, які не можна вловити в тій самій області, можна потрапити в навколишню область. Наприклад, помилка може не відображатися в збереженій процедурі, яка містить блок TRY/CATCH. Однак ця помилка може виникнути в блоці TRY/CATCH у коді, який називається збереженою процедурою, де сталася помилка.

Поширені помилки, які не можна знайти

Нижче наведено типові приклади помилок, які не можна знайти.

  • Компілювати помилки, наприклад синтаксичні помилки, які перешкоджають компіляції пакета.
  • Проблеми з перекомпіляцією рівня оператора, які зазвичай стосуються роздільної здатності відкладених імен. Наприклад, можна створити збережену процедуру, яка посилається на невідому таблицю. Помилка виникає, лише якщо процедура намагається усунути ім'я таблиці з ідентифікатором objectid.

Як відновити помилки за допомогою THROW

Якщо інструкція THROW використовується в блоці CATCH без будь-яких параметрів, вона переросте помилку, яка спричинила введення коду в блок CATCH. За допомогою цього методу можна впроваджувати журналювання помилок у базі даних, виловлюючи помилки та записуючи відомості про їх, а потім кидаючи вихідну помилку до клієнтської програми, щоб її можна було обробити там.

Ось приклад того, як перерости помилку.

BEGIN TRY
    -- code to be executed
END TRY
BEGIN CATCH
    PRINT ERROR_MESSAGE();
    THROW
END CATCH

У деяких попередніх версіях SQL Server не було методу, щоб викликати системну помилку. Хоча THROW не може вказати системну помилку для підвищення, коли THROW використовується без параметрів у блоці CATCH, він буде повторно використовувати як системні, так і помилки користувача.

Що таке функції обробки помилок

Функція CATCH блокує доступну інформацію, пов'язану з помилкою, протягом усього блоку CATCH. Це стосується підскопів, наприклад збережених процедур, запускаються з блоку CATCH.

Функції обробки помилок

Нагадаємо, що під час програмування з @@ERROR значення, яке утримує системна змінна @@ERROR, було скинуто після виконання наступної інструкції.

Ще однією ключовою перевагою структурованої обробки винятків у T-SQL є надання ряду функцій обробки помилок, і вони зберігають свої значення в блоці CATCH. Окремі функції надають кожну властивість помилки, яку було піднято.

Це означає, що ви можете написати загальну обробку помилок збереженими процедурами, які все ще можуть отримати доступ до інформації, пов'язаної з помилкою.

  • Функція CATCH блокує доступну інформацію, пов'язану з помилкою, протягом усього блоку CATCH.
  • @@Error скидається, коли виконується наступна інструкція.

Керування помилками в коді

Інтеграція SQL CLR дає змогу виконувати керований код у SQL Server. Мови .NET високого рівня, наприклад C# і VB, мають докладні відомості про обробку винятків. Помилки можна виявити за допомогою стандартних блоків .NET try/catch/finally.

Помилки в керованому коді

Загалом, ви можете виявити помилки в керованому коді якомога більше. Однак важливо усвідомити, що помилки, не оброблені в керованому коді, передаються назад до коду T-SQL, що викликається. Щоразу, коли будь-яка помилка, яка виникає в керованому коді, повертається до SQL Server, це, як видається, помилка 6522. Помилки можуть бути вкладені, і що конкретна помилка буде обтікати реальну причину помилки.

Ще однією рідкісною, але можливою причиною помилок в керованому коді може бути те, що код може виконувати інструкцію RAISERROR T-SQL через об'єкт SqlCommand.