Основные принципы обработки ошибок? - PullRequest
1 голос
/ 23 марта 2011

Это основной вопрос программирования, а не конкретный вопрос SQL Server.Я хотел бы знать, каковы основные принципы обработки ошибок?Когда происходит ошибка, должен ли код всегда генерировать исключения?Должно ли исключение всегда прекратить процедуру или пакет?

Ответы [ 2 ]

0 голосов
/ 23 марта 2011

Если вы используете SQL 2005 или 2008, вы должны использовать новые конструкции обработки ошибок TRY/CATCH и не проверять @@error после каждого оператора.Это способ работы в SQL 2000, и его намного сложнее читать и управлять им.

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

Посмотрите что-нибудь от Erland Sommerskog онлайн, связанное с обработкой ошибок.Он известный SQL Server MVP с обработкой ошибок как специальность.

0 голосов
/ 23 марта 2011

Способ обработки ошибки часто зависит от контекста.Есть определенные ошибки, которые вы можете ожидать.Примером этого может быть что-то вроде внешнего нарушения ключа.В этом случае вы можете просто зарегистрировать ошибку (потенциально записав ее как информационную, а не как соответствующую ошибку) и вернуть дружественное пользователю сообщение в пользовательский интерфейс, чтобы уведомить пользователя о возникновении проблемы.Другие ошибки являются неожиданными.Вероятно, они также должны регистрироваться и сообщаться пользователю с возможными дальнейшими шагами для получения трассировки исключений для команды разработчиков (например, по электронной почте и т. Д.).

Многие современные языки программирования в наши дни имеют структурированные возможности обработки исключений, которыеотслеживание и регистрация исключений довольно просто.Существует также ряд каркасов ведения журналов, которые помогут с регистрацией.Хорошие каркасы журналирования в .Net arena включают log4net, nLog и elmah.В Интернете должно быть множество примеров для всех этих каркасов ведения журналов.

Что касается SQL Server, возможности обработки ошибок не настолько развиты.

Общий шаблон для обработкиошибки в хранимой процедуре будут выглядеть примерно так:

create procedure [dbo].[test_dosomework]
(
  @param1 int,
  @param2 varchar(10)
)
as
begin
  declare @errorCode int

  select @errorCode = 0

  insert table1 (aValue)
  values (@param1)

  select @errorCode = @@ERROR

  if @errorCode = 0
  begin
    insert table1 (aValue2)
    values (@param2)

    select @errorCode = @@ERROR
  end 
  return @errorCode
end

. В этом случае, если в одном из операторов вставки возникает ошибка, @ERROR возвращает номер ошибки, @errorCode будет установлен с этим номером ошибки ивозвращаемое значение хранимой процедуры будет номером ошибки.Возвращаемое значение будет 0 для

...