RaiseError недостаточно поднял ошибку? - PullRequest
1 голос
/ 04 сентября 2010

Почему ошибка не появляется на уровне пользовательского интерфейса?Я использую ExecuteScaler

BEGIN CATCH

  PRINT N'The transaction is in an uncommittable state. Rolling back transaction.'
  ROLLBACK TRANSACTION;

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

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

  RAISERROR (@ErrorMessage, 
             @ErrorSeverity,
             @ErrorState);

END CATCH

Спасибо

Ответы [ 2 ]

1 голос
/ 04 сентября 2010

Вы можете вызывать только пользовательские сообщения, системные сообщения могут вызывать только двигатели:

Номера ошибок для пользовательских сообщений об ошибках должны быть больше 50000. Когда msg_id не указан, RAISERRORвыдает сообщение об ошибке с номером ошибки 50000.

Поэтому вы не можете поднять исходный @ErrorMessage, вам нужно поднять новый код ошибки.

Кроме того, ваш блок catch неверен, поскольку предполагает незафиксированную транзакцию.Это не всегда так, вы должны проверить результат XACT_STATE(), прежде чем принять решение, обречена ли транзакция.Есть много случаев, когда обработка ошибок может продолжить транзакцию.См. Обработка исключений и вложенные транзакции .

0 голосов
/ 05 сентября 2010

Сначала просмотрите статью Ремуса об обработке ошибок во вложенных транзакциях, чтобы понять весь объем вещей.

Затем попробуйте довести уровень ошибки до 16. Кроме того, вставьте исходную информацию об ошибке в ошибку.сообщение при сбросе ошибки, чтобы вы не потеряли эту информацию:

BEGIN TRY
  SELECT 1/0
END TRY

BEGIN CATCH

  DECLARE 
    @ErrorMessage  NVARCHAR(4000)
  , @ErrorNumber   INT
  , @ErrorSeverity INT
  , @ErrorState    INT
  , @ErrorLine     INT

  SELECT 
    @ErrorNumber   = ERROR_NUMBER()
  , @ErrorSeverity = ERROR_SEVERITY()
  , @ErrorState    = ERROR_STATE()
  , @ErrorLine     = ERROR_LINE();

  SET @ErrorMessage 
    = '>> Msg %i, Level %i, State %i, Line %i'
    + CHAR(13)+CHAR(10)+ERROR_MESSAGE()

  RAISERROR (
    @ErrorMessage,16,1
  , @ErrorNumber
  , @ErrorSeverity
  , @ErrorState
  , @ErrorLine
  )

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