Вы не можете повторно выбросить исходную ошибку. Вы должны выдать ошибку new с номером ошибки выше 50000, которая содержит захваченное сообщение об ошибке. См. Обработка исключений и вложенные транзакции , например:
begin catch
declare @error int, @message varchar(4000), @xstate int;
select @error = ERROR_NUMBER()
, @message = ERROR_MESSAGE();
raiserror ('Caught exception: %d: %s', 16, 1, @error, @message) ;
return;
end catch
В статье, на которую я ссылаюсь, есть более подробный пример, охватывающий также обязательную проверку XACT_STATE()
и смешивание блоков try / catch с семантикой транзакции.
В следующей версии («Denali») эта проблема исправлена, поскольку у вас есть возможность выдавать throw;
без любого аргумента, который вызовет исходное исключение, как в других языках try / catch. См. TRY CATCH THROW: Ошибка обработки изменений в T-SQL
Обновлено
О, я как бы читаю пост по диагонали. Если возникло больше исключений, вы можете поймать только одно. Это все еще верно, с Денали тоже. Но в большинстве случаев возникают исключительные ситуации серьезности 0 (то есть они на самом деле являются отпечатками, а не исключениями), и они по-прежнему передаются клиенту в виде информационных сообщений (SqlConnection.InfoMessage
события).