CodeGym /Kurslar /SQL SELF /Xətaların işlənməsi: RAISE EXCEPTION

Xətaların işlənməsi: RAISE EXCEPTION

SQL SELF
Səviyyə , Dərs
Mövcuddur

Təsəvvür elə, bir funksiya yazırsan ki, tələbənin orta balını hesablayır. Bəs nə olacaq, əgər sıfıra bölmək istəsən (məsələn, əgər qiymətlər yoxdursa)? Belə kodu real həyata buraxsan — və gözlənilməz qonaq kimi error dərhal gələcək. PL/pgSQL belə error-ları işləmək üçün güclü alətlər verir, kodunu dayanıqlı, təhlükəsiz və işləmək üçün rahat edir.

PL/pgSQL-də error handling imkan verir:

  1. Nə baş verdiyini izah edən mesajlar yaratmağa.
  2. Kritik error olduqda kodun icrasını dayandırmağa.
  3. Problemləri sonradan analiz üçün log-lamağa.

PL/pgSQL-də əsas mesaj səviyyələri

PL/pgSQL bir neçə mesaj səviyyəsini dəstəkləyir, bu da developer-lərə problemləri effektiv tapıb düzəltməyə kömək edir. Bax bunlardır:

  • NOTICE: informasiya mesajı çıxarır. Debug üçün istifadə olunur.
  • WARNING: potensial problem barədə xəbərdarlıq, amma proqramın icrasını dayandırmır.
  • EXCEPTION: kritik error, proqramın icrasını dayandırır (və idarəni çağıran koda qaytarır).

PL/pgSQL-də mesaj səviyyələri

Mesaj səviyyəsi Təsvir
NOTICE İnformasiya və ya debug mesajları. İcraya təsir etmir
WARNING Mümkün problemlər barədə xəbərdarlıq. İpucu kimi işləyir
EXCEPTION Ciddi error, proqramın icrasını dayandırır

RAISE komandasının sintaksisi

Mesaj yaratmaq və error-ları işləmək üçün RAISE operatorundan istifadə olunur. Onun əsas sintaksisi belədir:

RAISE <mesaj səviyyəsi> 'mesaj mətni' [, dəyişənlər...];
  • <mesaj səviyyəsi>NOTICE, WARNING, EXCEPTION.
  • 'mesaj mətni' — problemin təsviri.
  • [dəyişənlər...] — mesaja əlavə dəyərlər ötürmək üçün.

Nümunə 1: RAISE NOTICE istifadəsi

Bəzən funksiyanın içində nə baş verdiyini bilmək vacibdir. Məsələn, dövrü debug etmək üçün:

DO $$
BEGIN
    FOR i IN 1..5 LOOP
        RAISE NOTICE 'Hazırki i dəyəri: %', i;
    END LOOP;
END
$$;

Nəticə: Konsolda Hazırki i dəyəri: 1, Hazırki i dəyəri: 2 və s. 5-ə qədər çıxacaq.

Nümunə 2: RAISE EXCEPTION istifadəsi

İndi təsəvvür elə, bir funksiya yazırsan ki, müəyyən şərtlərdə error ilə bitməlidir:

DO $$
BEGIN
    IF 1 = 1 THEN
        RAISE EXCEPTION 'Nəsə düz getmədi!';
    END IF;
END
$$;

Nəticə: icra dayandırılır və error mesajı konsola çıxır.

RAISE-də parametrlərlə işləmək

Parametrlərdən istifadə edərək mesaj mətnini fərdiləşdirə bilərsən. Bunun üçün % placeholder-larından istifadə olunur:

Nümunə 3: RAISE-də dəyişənlərin əlavə olunması

DO $$
DECLARE
    student_name TEXT := 'İvan';
    average_score NUMERIC := NULL;
BEGIN
    IF average_score IS NULL THEN
        RAISE EXCEPTION 'Tələbənin % orta balı yoxdur!', student_name;
    END IF;
END
$$;

Nəticə: Tələbənin İvan orta balı yoxdur! mesajı çıxır.

Gördüyün kimi, % dəyişən student_name ilə əvəz olunur və mesaj daha mənalı olur.

İstifadəçi error-larının yaradılması

Error-lar həmişə fors-major deyil! Bəzən onları qəsdən yaratmaq lazımdır ki, kodu səhv datalardan qoruya biləsən.

Nümunə 4: giriş dəyərlərinin yoxlanması

Bir funksiya yazaq ki, daxil olan ədədin dəyərini yoxlayır və əgər mənfidirsə, error atır:

CREATE OR REPLACE FUNCTION check_positive(value NUMERIC)
RETURNS TEXT AS $$
BEGIN
    IF value < 0 THEN
        RAISE EXCEPTION 'Ədəd % mənfidir!', value;
    END IF;
    RETURN 'Ədəd düzgündür.';
END;
$$ LANGUAGE plpgsql;

İndi funksiyanı test edək:

SELECT check_positive(-5);

Nəticə: Ədəd -5 mənfidir! error mesajı çıxır.

Əgər müsbət dəyər versən:

SELECT check_positive(10);

Nəticə: Ədəd düzgündür.

Kontekstdə error handling

Error yaratmağı bacarırsansa, daha yaxşısı — onları vəziyyətdən asılı olaraq işləməkdir. Bunun üçün BEGIN ... EXCEPTION bloku istifadə olunur.

Error handling strukturu

BEGIN
    -- Sənin əsas kodun
EXCEPTION
    WHEN XƏTA_TİPİ THEN
        -- Error zamanı nə etmək lazımdır
    WHEN BAŞQA_XƏTA THEN
        -- Başqa error zamanı nə etmək lazımdır
    WHEN OTHERS THEN
        -- Qalan bütün error-ların işlənməsi
END;

Komponentləri izah edək:

  • EXCEPTION — error handling blokunun başlanğıcını göstərən açar söz.
  • WHEN — konkret error tipini göstərməyə imkan verir, məsələn, unique_violation və ya division_by_zero.
  • OTHERSWHEN bloklarında açıq göstərilməyən bütün error-ları işləmək üçün istifadə olunur.

Nümunə 5: sıfıra bölmənin işlənməsi

Sadə bölmə funksiyası ilə error handling-i göstərək:

CREATE OR REPLACE FUNCTION safe_divide(a NUMERIC, b NUMERIC)
RETURNS NUMERIC AS $$
BEGIN
    -- Bölməyə cəhd edirik
    RETURN a / b;
EXCEPTION
    WHEN division_by_zero THEN
        RAISE WARNING 'Sıfıra bölmə cəhdi. NULL qaytarıram.';
        RETURN NULL;
END;
$$ LANGUAGE plpgsql;

Funksiyanı yoxlayaq:

SELECT safe_divide(10, 2);  -- Gözlənilən nəticə: 5
SELECT safe_divide(10, 0);  -- Gözlənilən nəticə: NULL və konsolda xəbərdarlıq

RAISE istifadə edərkən tipik səhvlər

Mesaj səviyyəsinin unudulması. Əgər səviyyəni göstərməyi unutsan, PostgreSQL error verəcək.

Səhv:

RAISE 'Səviyyəsiz mesaj';

Düzgün:

RAISE NOTICE 'NOTICE səviyyəli mesaj';

Yanlış parametrlər. Əgər % istifadə edirsənsə, lazım olan qədər dəyişən ötürdüyünə əmin ol.

Səhv:

RAISE NOTICE 'Parametr ilə nümunə %';

Düzgün:

RAISE NOTICE 'Parametr ilə nümunə %', 'dəyər';

Həddindən artıq istifadə. RAISE EXCEPTION-dan çox istifadə vacib əməliyyatların icrasını dayandıra bilər. Onu ağılla istifadə et.

Faydalı məsləhətlər

  1. WHEN OTHERS blokuna diqqətli ol. Mümkün qədər konkret error-ları göstər, əks halda başqa cür işlənməli olan error-ları da tutmuş olarsan.
  2. RAISE-ı debug üçün istifadə et. Heç vaxt error-ları işlənmədən buraxma.
  3. Performansı unutma. Error handling böyük prosedurlarda baha başa gələ bilər.

Əgər hər şeyi düzgün etsən, prosedurların dayanıqlı olacaq və hətta gözlənilməz crash-lara da tab gətirəcək. PM səninlə fəxr edə bilər!

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION