Ошибка обработки проблемы в SQL Server - PullRequest
1 голос
/ 07 сентября 2011

Я использую C # и набор типизированных данных, который связан с хранимой процедурой в базе данных SQL Server Express.В хранимой процедуре я использую try catch для обработки ошибок.

Вот мой блок catch:

begin catch
    select 
        error_number() as errorNumber, 
        error_severity() as errorSeverity,
        error_state() as errorState,
        error_procedure() as errorProcedure,
        error_line() as errorLine,
        error_message() as errorMessage
end catch
  1. - это try catch лучший способ обработки ошибок в дб ??

    , поскольку SQL Server будет возвращать информацию об ошибке в виде таблицы, как мне распознать, заполнена ли возвращаемая таблица данными или содержит информацию об ошибке ??: Хорошо, я получил исключение и выбросил его ??но почему?Я имею в виду, что если я не поймаю его с самого начала, оно будет зависеть от моего приложения, и я смогу управлять им там.так зачем мне использовать try catch ??

Ответы [ 4 ]

2 голосов
/ 07 сентября 2011

Пожалуйста, прочитайте эту статью Обработка ошибок в SQL 2005 и более поздних версиях , написанная Erland Sommarskog, SQL Server MVP.

1 голос
/ 07 сентября 2011

Это может быть хорошим способом обработки ошибок в хранимой процедуре, однако чаще всего вы делаете это для регистрации ошибки в таблице:

begin catch
    insert into ErrorLog
    select 
        error_number() as errorNumber, 
        error_severity() as errorSeverity,
        error_state() as errorState,
        error_procedure() as errorProcedure,
        error_line() as errorLine,
        error_message() as errorMessage
end catch

ОднакоИсходя из того, что исключения должны возникать только в исключительных случаях, вы почти наверняка захотите сбросить ошибку, чтобы ваш код мог обработать это исключение наиболее рациональным способом.

На сервере sql это достигается с помощью команды RAISERROR ( docs ).

Ваш код будет выглядеть примерно так:

BEGIN CATCH
    DECLARE @ErrorMessage NVARCHAR(4000);
    DECLARE @ErrorSeverity INT;
    DECLARE @ErrorState INT;

    SELECT 
        @ErrorMessage = ERROR_MESSAGE(),
        @ErrorSeverity = ERROR_SEVERITY(),
        @ErrorState = ERROR_STATE();

    -- You could log the error here
    INSERT INTO ErrorLog(message, severity, state)
    VALUES(@ErrorMessage, @ErrorSeverity, @ErrorState)

    -- Use RAISERROR inside the CATCH block to return error
    RAISERROR (@ErrorMessage, -- Message text.
               @ErrorSeverity, -- Severity.
               @ErrorState -- State.
               );
END CATCH;
1 голос
/ 07 сентября 2011

Просто помните, что если вам нужно сообщить об исключении в ваше приложение (как в catch (SQLException ex) в вашем C #), ваш блок захвата SPROC должен будет перебросить (RAISERROR) исключение, а также убедиться, что уровень серьезности > 10 TRY и RAISERROR в T-SQL

0 голосов
/ 02 июня 2014

Также помните, что если ваша транзакция откатывается, ваши записи в журнале также заканчиваются без записей в журнале ...

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