Это может быть хорошим способом обработки ошибок в хранимой процедуре, однако чаще всего вы делаете это для регистрации ошибки в таблице:
begin catch
insert into ErrorLog
select
error_number() as errorNumber,
error_severity() as errorSeverity,
error_state() as errorState,
error_procedure() as errorProcedure,
error_line() as errorLine,
error_message() as errorMessage
end catch
ОднакоИсходя из того, что исключения должны возникать только в исключительных случаях, вы почти наверняка захотите сбросить ошибку, чтобы ваш код мог обработать это исключение наиболее рациональным способом.
На сервере sql это достигается с помощью команды RAISERROR
( docs ).
Ваш код будет выглядеть примерно так:
BEGIN CATCH
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT
@ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
-- You could log the error here
INSERT INTO ErrorLog(message, severity, state)
VALUES(@ErrorMessage, @ErrorSeverity, @ErrorState)
-- Use RAISERROR inside the CATCH block to return error
RAISERROR (@ErrorMessage, -- Message text.
@ErrorSeverity, -- Severity.
@ErrorState -- State.
);
END CATCH;