Sql Server Пользовательские исключения - PullRequest
0 голосов
/ 14 февраля 2012

Итак, в Sql Server кажется, что у меня не может быть определенных шагов в моей ветви catch, как в PL / SQL (я мог бы добавить проверки IF / ELSE).

Так что в PL / SQL у меня было бы что-то вроде этого

DECLARE

  MY_EXCEPTION EXCEPTION;

BEGIN

  //My Error is Raised

EXCEPTION
  WHEN MY_EXCEPTION THEN
   //Perform actions

END

Как другие справляются с этим? Есть ли более элегантное решение с TRY / CATCH, чем использование операторов IF для просмотра ошибок и выполнения операций?

Спасибо

S

Ответы [ 2 ]

3 голосов
/ 14 февраля 2012

Какие операции?Вы хотите сказать, что хотите объявить в другом месте, что для исключения A оно регистрируется, а исключение B просто игнорируется, и ваш блок catch наследует эти действия?SQL Server 2012 добавляет THROW, так что вы можете делать другие вещи (регистрировать, отправлять электронную почту и т. Д.), А затем, по существу, повторно выдавать ошибку, которая вначале вызвала перехват - но нет способа определить обработку ошибокцентрализованно, если только вы не передадите номер ошибки, серьезность и т. д. в хранимую процедуру (тогда логика может быть выполнена в процедуре, а не в блоке CATCH).Быстрый пример:

CREATE PROCEDURE dbo.CustomErrorHandler
    @ErrorNumber INT,
    @ProcID INT
AS
BEGIN
    IF @ErrorNumber = 8134
    BEGIN
        PRINT 'Oh, it was just divide by 0 in '
            + COALESCE(OBJECT_NAME(@ProcID), 'ad hoc');
        RETURN;
    END

    IF @ErrorNumber = 208
    BEGIN
        PRINT 'Invalid object access!';
        -- send e-mail about invalid object access
        RETURN;
    END

    /* other custom handling for other exceptions */

    RAISERROR('Unhandled exception I guess?', 11, 1);
END
GO

Тогда вы можете поиграть с различными исключениями (ну, по крайней мере, с теми, которые проходят фазу синтаксического анализа, по крайней мере):

BEGIN TRY
    SELECT 1/0; --8134
    --EXEC('SELECT * FROM splunge;'); --208
END TRY
BEGIN CATCH
    DECLARE 
        @e INT = ERROR_NUMBER(),
        @p INT = @@PROCID;

    EXEC dbo.CustomErrorHandler @e, @p;
END CATCH

Библию об обработке ошибок смотрите в Erland'sстатьи http://www.sommarskog.se/error-handling-I.html, http://www.sommarskog.se/error-handling-II.html и http://www.sommarskog.se/error_handling_2005.html

0 голосов
/ 14 февраля 2012

В самых последних SQL-серверах вы можете использовать блоки try try, например:

BEGIN try 

код

END try

BEGIN catch

делать все, что вам нужно в случае исключения

END catch    

В старых версиях вы застряли с

IF @@ERROR > 0 THEN BEGIN

делайте вещи

END IF
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...