Şunu belirtmek gerekir ki, ve teknik olarak teknik olarak mümkün olsa bile THROW
ve RAISERROR
muhtemelen (muhtemelen) bunu gerçekten yapmak istemezsiniz. Neden? Parametresiz çok şık yeteneği Çünkü THROW
kullanarak hatayı yeniden atmak aynı İleti Sayısı (yani Msg 8134
yerine Msg X
nerede X
> = 50000) aralarındaki tek fark değil: THROW
bir toplu iptal süre RAISERROR
değildir. Bu, aşağıda gösterildiği gibi önemli bir davranış farkı olabilir.
Test kurulumu
--DROP PROC ##Throw;
--DROP PROC ##RaisError;
GO
CREATE PROCEDURE ##Throw
AS
SET NOCOUNT ON;
BEGIN TRY
SELECT 1/0 AS [DivideByZero];
END TRY
BEGIN CATCH
THROW;
END CATCH;
SELECT 1 AS [AA];
GO
CREATE PROCEDURE ##RaisError
AS
SET NOCOUNT ON;
BEGIN TRY
SELECT 1/0 AS [DivideByZero];
END TRY
BEGIN CATCH
RAISERROR('test, yo!', 16, 1);
-- RETURN; -- typically at end of CATCH block when using RAISERROR
END CATCH;
SELECT 2 AS [BB];
GO
Test 1
EXEC ##Throw;
SELECT 3 AS [CC];
İadeler:
"Results" Tab:
DivideByZero
{empty result set}
"Messages" Tab:
Msg 8134, Level 16, State 1, Procedure ##Throw, Line 38
Divide by zero error encountered.
Test 2
EXEC ##RaisError;
SELECT 4 AS [DD];
İadeler:
"Results" Tab:
DivideByZero
{empty result set}
BB
2
DD
4
"Messages" Tab:
Msg 50000, Level 16, State 1, Procedure ##RaisError, Line 45
test, yo!
Adil olmak gerekirse, bu farkı aşağıdakileri yaparak maskelemek mümkündür:
- Kodun tüm çağrılarını her zaman
THROW
bir TRY...CATCH
yapı içinde kullanın (aşağıda gösterilmiştir)
- Hiçbir zaman yer kodundan sonraki
THROW
(iyi, için hariç END CATCH;
)
Test 3
BEGIN TRY
EXEC ##Throw;
SELECT 5 AS [EE];
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() AS [ErrorNumber], ERROR_MESSAGE() AS [ErrorMessage];
END CATCH;
SELECT 6 AS [FF];
GO
İadeler:
"Results" Tab:
DivideByZero
{empty result set}
ErrorNumber ErrorMessage
8134 Divide by zero error encountered.
FF
6
Test 4
BEGIN TRY
EXEC ##RaisError;
SELECT 7 AS [GG];
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() AS [ErrorNumber], ERROR_MESSAGE() AS [ErrorMessage];
END CATCH;
SELECT 8 AS [HH];
GO
İadeler:
"Results" Tab:
DivideByZero
{empty result set}
ErrorNumber ErrorMessage
50000 test, yo!
HH
8