Это правда. В руководящих принципах взаимодействия с человеком говорится, что для нижней панели должно быть от 3 до 5 элементов.
Необходимо считать это:
http://www.sommarskog.se/error-handling-I.html
Я не могу рекомендовать ту ссылку достаточно высоко. Это немного длинно, но хорошим способом.
Существует правовая оговорка в передней стороне, что она была первоначально записана для SQL Server 2000, но она покрывает новые способности к обработке ошибок попытки/выгоды в SQL Server 2005 + также.
Мы в настоящее время используем этот шаблон для любых запросов, которые мы выполняем (Вы могли не учесть материал Транзакции, если Вам не нужен он в, например, оператор DDL):
BEGIN TRANSACTION
BEGIN TRY
// do your SQL statements here
COMMIT TRANSACTION
END TRY
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
ROLLBACK TRANSACTION
END CATCH
Конечно, Вы могли легко вставить перехваченную исключительную ситуацию в свою таблицу ошибок.
Это работает действительно хорошо на нас. Вы могли, вероятно, даже автоматизировать часть преобразования от Вашего старого сохраненного procs до нового формата с помощью Генерации кода (например, CodeSmith) или некоторый пользовательский код C#.
Нет набора в каменных лучших практиках для Обработки ошибок. Все это сводится к тому, что Ваши потребности и быть последовательным.
Вот образец таблицы и хранимой процедуры, которая хранит номера телефона.
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Phone](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Phone_Type_ID] [int] NOT NULL,
[Area_Code] [char](3) NOT NULL,
[Exchange] [char](3) NOT NULL,
[Number] [char](4) NOT NULL,
[Extension] [varchar](6) NULL,
CONSTRAINT [PK_Phone] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/**/
CREATE PROCEDURE [dbo].[usp_Phone_INS]
@Customer_ID INT
,@Phone_Type_ID INT
,@Area_Code CHAR(3)
,@Exchange CHAR(3)
,@Number CHAR(4)
,@Extension VARCHAR(6)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Err INT, @Phone_ID INT
BEGIN TRY
INSERT INTO Phone
(Phone_Type_ID, Area_Code, Exchange, Number, Extension)
VALUES
(@Phone_Type_ID, @Area_Code, @Exchange, @Number, @Extension)
SET @Err = @@ERROR
SET @Phone_ID = SCOPE_IDENTITY()
/*
Custom error handling expected by the application.
If Err = 0 then its good or no error, if its -1 or something else then something bad happened.
*/
SELECT ISNULL(@Err,-1) AS Err, @Phone_ID
END TRY
BEGIN CATCH
IF (XACT_STATE() <> 0)
BEGIN
ROLLBACK TRANSACTION
END
/*
Add your own custom error handling here to return the passed in paramters.
I have removed my custom error halding code that deals with returning the passed in parameter values.
*/
SELECT ERROR_NUMBER() AS Err, ISNULL(@Phone_ID,-1) AS ID
END CATCH
END
Похоже, что у Вас уже есть очень хороший дескриптор на этом. Я подозреваю, что Вы делаете больше чем 95% SQL-программистов там.
Необходимо найти некоторую интересную информацию здесь:
Одно [несвязанное] предложение: начните использовать' <>' вместо'! = '.
[* Наркоманы SQL ушли, таким образом, вторая статья не доступна. Я попытаюсь переиздать его где-нибудь и обновить ссылку.]