Berikut adalah bagian dari template prosedur tersimpan yang saya gunakan:
/* CREATE PROCEDURE... */
DECLARE
@ErrorMessage varchar(2000)
,@ErrorSeverity tinyint
,@ErrorState tinyint
/* Additional code */
BEGIN TRY
/* Your code here */
END TRY
BEGIN CATCH
SET @ErrorMessage = ERROR_MESSAGE()
SET @ErrorSeverity = ERROR_SEVERITY()
SET @ErrorState = ERROR_STATE()
RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState)
BREAK
END CATCH
/* Further cleanup code */
Blok Coba/Tangkap bisa rumit tetapi jauh lebih teliti daripada @@error. Lebih penting lagi, Anda dapat menggunakan berbagai fungsi error_xxx() di dalamnya. Di sini, saya menyimpan pesan kesalahan yang tepat dalam variabel @ErrorMessage, bersama dengan data lain yang cukup untuk meningkatkan kembali kesalahan. Dari sini, sejumlah opsi tersedia; Anda dapat menjadikan @ErrorMessage sebagai variabel keluaran, menguji dan menangani kesalahan tertentu, atau membuat pesan kesalahan Anda sendiri (atau menyesuaikan yang sudah ada agar lebih jelas--Anda mungkin kesal mengetahui seberapa sering Anda ingin melakukannya). Opsi lain akan muncul di level mereka.
Sesuatu yang harus diwaspadai:dalam beberapa situasi, SQL akan melemparkan dua pesan kesalahan secara berurutan... dan error_message()
hanya akan menangkap yang terakhir, yang biasanya mengatakan sesuatu seperti "usaha membuat objek gagal", dengan kesalahan nyata yang diberikan dalam pesan kesalahan pertama. Di sinilah membuat pesan kesalahan Anda sendiri.