Да, единственная причина для Try Catch (как в обычном коде) заключается в том, что вы можете «обработать» ошибку, т. Е. Вы можете исправить ошибку и успешно завершить любую функцию, которую выполняла процедура, или Если вы хотите что-то сделать с ошибкой, прежде чем вернуть ее клиенту (например, изменить сообщение или сохранить его в таблице журнала ошибок или отправить кому-то электронное письмо и т. д. (хотя я бы предпочел сделать большинство этих слой DAL)
Технически, однако, предложение catch не возвращает ошибку. это просто возвращает набор результатов с информацией об ошибке. Это очень отличается, так как это не вызовет исключения в клиентском коде. Вот почему ваш вывод верен, вы должны просто позволить исходной ошибке распространяться прямо на код клиента.
Как вы написали, клиенту не будет возвращено никакой ошибки. Как и в обычном коде, если вы не обрабатываете (исправляете) ошибку в предложении catch, вы всегда должны перебрасывать ее (в sql, что означает функцию Raiserror) в предложении catch. То, что вы сделали выше, в целом плохо, клиентский код может или не может иметь какую-либо возможность правильно справиться с
совершенно другой набор записей (один с информацией об ошибке) от того, что он ожидал. Некоторые вызовы (например, вставки обновлений или удалений) могут вообще не ожидать или искать возвращенный набор записей ... Вместо этого, если вы хотите или должны что-то сделать с ошибкой в процедуре перед возвратом ее клиенту, используйте Raiserror()
функция
BEGIN TRY
-- Generate divide-by-zero error.
SELECT 1/0;
END TRY
BEGIN CATCH
-- Other code to do logging, whatever ...
Raiserror(ERROR_MESSAGE(), ERROR_NUMBER(), ERROR_STATE() )
END CATCH;