Это поведение задокументировано
Следующие типы ошибок не обрабатываются блоком CATCH, когда
они происходят на том же уровне исполнения, что и TRY ... CATCH
построить:
Ошибки компиляции, такие как синтаксические ошибки, которые мешают пакету
работает.
Ошибки, возникающие при перекомпиляции на уровне операторов, например, объект
разрешение имен ошибки, возникающие после компиляции из-за
отложенное разрешение имен.
Ошибки разрешения имен объектов
Эти ошибки возвращаются на уровень, на котором запущен пакет, сохраняются
процедура или триггер.
Вы не можете поймать несуществование объекта с TRY...CATCH
в хранимой процедуре.
Например:
CREATE PROC TestProc AS
BEGIN
BEGIN TRY
SELECT *
FROM dbo.doesnoexists;
END TRY
BEGIN CATCH
PRINT ('An error occured!')
END CATCH
END
GO
EXEC TestProc;
Возвращает ошибку:
Сообщение 208, Уровень 16, Состояние 1, Процедура TestProc, Строка 6 [Стартовая Строка 15]
Неверное имя объекта 'dbo.doesnoexists'.
Вам нужно сделать TRY...CATCH
вне процедуры.
ALTER PROC TestProc AS
BEGIN
SELECT *
FROM dbo.doesnoexists;
END
GO
BEGIN TRY
EXEC TestProc;
END TRY
BEGIN CATCH
PRINT 'An error occured!';
END CATCH
Затем будет напечатано 'An error occured!'
. Конечно, вместо этого используйте ERROR_NUMBER()
, ERROR_MESSAGE()
и т. Д., Чтобы получить более подробную информацию о произошедшей ошибке и зарегистрировать их по мере необходимости.