Ana içeriğe geç
Kesit SQL
İleri · T-SQL (SQL Server)

Hata yönetimi: TRY/CATCH, THROW ve işlemler

Hataları yakalamak, anlamlı mesaj üretmek ve işlemi güvenle geri almak.

Uygulamada aç, 3 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

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;
THROWRAISERROR
Sürüm2012+ (önerilen)Eski
Hata numarası50000+ kullanıcı tanımlıMesaj metni veya sys.messages
CATCH içinde parametresizOrijinal hatayı yeniden fırlatırDesteklemez
Önem (severity)Her zaman 16Belirlenebilir (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.
Alıştırmalara geç (3)