Поток исключений в хранимой процедуре, вызывающей другую хранимую процедуру
У меня есть хранимая процедура, которая вызывает другую хранимую процедуру. В пакете обновления 2 есть попытка / транзакция / отлов / откат / raiserror. Если SP2 вызывает ошибку, будет ли он вызывать вызывающего абонента через SP1, или я должен также вкладывать вызов SP2 в try / catch? Если последнее имеет место, как я могу убедиться, что я не убиваю "трассировку стека" ошибки от SP2 при поднятии / выходе SP1?
- будет ли в этом пузыре ошибка SP2 и выхода из SP1?
EXEC dbo.storedProc2 @someParameter = @someValue
- Или мне нужно это сделать?
BEGIN TRY
EXEC dbo.storedProc2 @someParameter = @someValue
END TRY
BEGIN CATCH
-- this is what I normally do in a simple catch/raise scenario:
-- will it kill the error stack?
DECLARE @ErrMsg VARCHAR(4000), @ErrSeverity INT, @ErrState INT, @ErrLine INT
SELECT @ErrMsg = ERROR_MESSAGE() + ' Line %d',
@ErrSeverity = ERROR_SEVERITY(),
@ErrState = ERROR_STATE(),
@ErrLine = ERROR_LINE()
RAISERROR(@ErrMsg, @ErrSeverity, @ErrState, @ErrLine)
END CATCH
2 ответа
Вам нужно будет иметь внешний TRY/CATCH
блок.
Если у вас есть только перехват ошибок в SP2, то при ошибках SP2 он будет прерван.
Затем он передаст код ошибки обратно в SP1, но SP1 продолжит выполняться в большинстве случаев (исключение будет фатальной ошибкой со степенью серьезности 20-25).
Там нет реального присущего ошибки, не используя TRY/CATCH
(или проверка @@Error
если вы старомодный) - код будет продолжать выполняться, к лучшему или к худшему.
Вы должны ловить и устранять ошибки WITHIN dbo.storedProc2
Затем верните коды ошибок, используя метод return n
SP1 может затем обработать эту ошибку (ошибки) любым необходимым способом.