Как сделать обработку ошибок в хранимой процедуре - PullRequest
3 голосов
/ 06 марта 2012

Я сейчас использую Sybase ASE 12.5.У меня есть код ниже:

create procedure test_launcher_fail_wrapper
as
begin

   select convert(numeric(2),1234345)

   if @@error != 0
   begin
      select "SP failed to execute"
      return 1
   end

end

Здесь я пытаюсь преобразовать очень большое значение / сумму (1234345) в числовой размер 2. Это невозможно, и это приводит к ошибке.

Вопросы:

  1. Полезно ли иметь @@ error здесь?Я запустил этот SP, и он никогда не входил в обработку ошибок
  2. Как обрабатывать ошибки в таких сценариях?

Ответы [ 3 ]

0 голосов
/ 08 августа 2012

Это ловит вашу ошибку?

create procedure test_launcher_fail_wrapper
as
begin

  declare @database_err int

  set @database_err = 0

  select convert(numeric(2),1234345)

  set @database_err = @@error

  if @database_err <> 0
  begin
    PRINT  'SP failed to execute'
    return 1
  end

end
0 голосов
/ 16 апреля 2016

@@ error это путь, но будьте осторожны, так как:

Каждый оператор Transact-SQL, включая операторы печати и тесты, сбрасывает ошибку @@, поэтому проверка состояния должна следовать сразу за пакетом, для которого идет речь об успехе.

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

Пример:

create procedure proc1 as
begin
    select convert(numeric(2),1234345)
    if @@error <> 0
    begin
        raiserror 20001 "Error during convert in proc1"
        return 1
    end
end
0 голосов
/ 06 марта 2012

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

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

...