TRY / CATCH
BEGIN TRY
SELECT 1 / 0 AS sonuc;
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() AS hata_no,
ERROR_SEVERITY() AS onem,
ERROR_MESSAGE() AS mesaj;
END CATCH;
CATCH bloğunda ERROR_NUMBER(), ERROR_MESSAGE(), ERROR_LINE(), ERROR_PROCEDURE() fonksiyonlarıyla hatanın ayrıntılarına ulaşılır.
İşlem + hata = güvenli değişiklik
Bir işlemin ortasında hata olursa önceki adımların da geri alınması gerekir. Standart kalıp:
BEGIN TRY
BEGIN TRANSACTION;
UPDATE products SET stock = stock - 5 WHERE product_id = 1;
-- Aşağıdaki satır birincil anahtar ihlali yapar
INSERT INTO products (product_id, name, category, price, cost)
VALUES (1, N'Kopya ürün', N'Test', 10, 5);
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION;
PRINT 'İşlem geri alındı: ' + ERROR_MESSAGE();
END CATCH;
SELECT product_id, stock FROM products WHERE product_id = 1;
Stok değişmedi: UPDATE de geri alındı. Mesajlar sekmesine bak.
THROW ile kendi hatanı fırlatmak
DECLARE @stok INT = (SELECT stock FROM products WHERE product_id = 39);
BEGIN TRY
IF @stok = 0
THROW 50001, N'Stokta olmayan ürün satılamaz.', 1;
PRINT 'Satış yapıldı.';
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() AS hata_no, ERROR_MESSAGE() AS mesaj;
END CATCH;
THROW | RAISERROR | |
|---|---|---|
| Sürüm | 2012+ (önerilen) | Eski |
| Hata numarası | 50000+ kullanıcı tanımlı | Mesaj metni veya sys.messages |
| CATCH içinde parametresiz | Orijinal hatayı yeniden fırlatır | Desteklemez |
| Önem (severity) | Her zaman 16 | Belirlenebilir (10 ve altı yalnızca mesaj) |
SET XACT_ABORT ONSaklı yordamların başına eklenirse, herhangi bir çalışma zamanı hatasında tüm işlem otomatik geri alınır. Gerçek sistemlerde TRY/CATCH ile birlikte önerilir.