Поток исключений в хранимой процедуре, вызывающей другую хранимую процедуру

У меня есть хранимая процедура, которая вызывает другую хранимую процедуру. В пакете обновления 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 может затем обработать эту ошибку (ошибки) любым необходимым способом.

Другие вопросы по тегам