Какие операции?Вы хотите сказать, что хотите объявить в другом месте, что для исключения A оно регистрируется, а исключение B просто игнорируется, и ваш блок catch наследует эти действия?SQL Server 2012 добавляет THROW
, так что вы можете делать другие вещи (регистрировать, отправлять электронную почту и т. Д.), А затем, по существу, повторно выдавать ошибку, которая вначале вызвала перехват - но нет способа определить обработку ошибокцентрализованно, если только вы не передадите номер ошибки, серьезность и т. д. в хранимую процедуру (тогда логика может быть выполнена в процедуре, а не в блоке CATCH
).Быстрый пример:
CREATE PROCEDURE dbo.CustomErrorHandler
@ErrorNumber INT,
@ProcID INT
AS
BEGIN
IF @ErrorNumber = 8134
BEGIN
PRINT 'Oh, it was just divide by 0 in '
+ COALESCE(OBJECT_NAME(@ProcID), 'ad hoc');
RETURN;
END
IF @ErrorNumber = 208
BEGIN
PRINT 'Invalid object access!';
-- send e-mail about invalid object access
RETURN;
END
/* other custom handling for other exceptions */
RAISERROR('Unhandled exception I guess?', 11, 1);
END
GO
Тогда вы можете поиграть с различными исключениями (ну, по крайней мере, с теми, которые проходят фазу синтаксического анализа, по крайней мере):
BEGIN TRY
SELECT 1/0; --8134
--EXEC('SELECT * FROM splunge;'); --208
END TRY
BEGIN CATCH
DECLARE
@e INT = ERROR_NUMBER(),
@p INT = @@PROCID;
EXEC dbo.CustomErrorHandler @e, @p;
END CATCH
Библию об обработке ошибок смотрите в Erland'sстатьи http://www.sommarskog.se/error-handling-I.html, http://www.sommarskog.se/error-handling-II.html и http://www.sommarskog.se/error_handling_2005.html