CodeGym /Kurslar /SQL SELF /Xətaların loglanması: log səviyyələri və mesaj formatı

Xətaların loglanması: log səviyyələri və mesaj formatı

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

İndi biz sanki gizli agentik — funksiyalarımız və prosedurlarımız missiyaları yerinə yetirir: dataları emal edir, hesablamalar aparır və ya sadəcə bazanın içində bir az sehr edir. Bəs nəsə düz getməsə, necə bilək? "Data üçün massaj vannası" hansı mərhələdə sıradan çıxıb, necə anlayaq? Burada köməyə loglama və error handling gəlir.

Yadındadırsa, artıq başlamışdıq baxmağa ki, PostgreSQL və PL/pgSQL-də necə "ünsiyyət qurmaq" və log aparmaq olar:

  • RAISE NOTICE: rahat, dost ton — "Ay, burda hər şey qaydasındadır, amma bəlkə baxmaq istərsən".
  • RAISE WARNING: bir az yüksək ton — "Aha, burda nəsə qəribədir, bəlkə baxasan".
  • RAISE EXCEPTION: panik siqnalı — "STOP! Alqoritm bəlada! İcranı dayandırdıq ki, hər şey dağılmasın".

Bunların hər birinin öz məqsədi var və düzgün seçmək vacibdir, hansını istifadə edəcəksən.

Mesajlar kodda belə görünür:

DO $$
BEGIN
    -- NOTICE səviyyəsi (hər şey normaldır, sadəcə bildiriş)
    RAISE NOTICE 'Sadəcə bildiriş: dataların emalı başladı';

    -- WARNING səviyyəsi (nəsə şübhəli)
    RAISE WARNING 'Xəbərdarlıq: sütundakı data formatı düzgün olmaya bilər';

    -- EXCEPTION səviyyəsi (kritik xəta)
    RAISE EXCEPTION 'Xəta: daxil olan dəyər düzgün deyil!';
END $$;

Nə vaxt istifadə etməli:

  • RAISE NOTICE — debug və rahat info çıxışı üçün.
  • RAISE WARNING — potensial səhv datalar barədə xəbərdarlıq üçün.
  • RAISE EXCEPTION — kritik xətalar baş verəndə, funksiyanın icrası dayandırılmalıdır.

RAISE EXCEPTION ilə error handling

RAISE EXCEPTION — sənin stop-kranın. Nəsə düz getmirsə, funksiyanın icrasını dayandırıb, xəta barədə xəbər verə bilərsən.

Xatırladaq, əsas istifadə belədir:

RAISE EXCEPTION 'Sənin xəta mesajın';

Amma mesajları daha informativ etmək üçün dəyişənlərdən istifadə edə bilərsən:

DECLARE
    input_value INTEGER;
BEGIN
    input_value := NULL;

    IF input_value IS NULL THEN
        RAISE EXCEPTION 'Xəta: daxil olan dəyər NULL-dur. INTEGER dəyəri gözlənilirdi';
    END IF;
END;

Mesajların formatlanması

Dəyişənləri birbaşa mesajın içinə əlavə edə bilərsən:

DECLARE
    var1 TEXT := 'Data';
    var2 INTEGER := 42;
BEGIN
    RAISE EXCEPTION 'Emal zamanı xəta % ID % ilə', var1, var2;
END;

Çıxış: Emal zamanı xəta Data ID 42 ilə.

Nümunə: datanın validasiyası

Təsəvvür elə, səndə bir prosedur var, insanın yaşını qəbul edir. Əgər yaş mənfi olarsa, məntiqlə xəta atmaq lazımdır:

CREATE OR REPLACE FUNCTION validate_age(age INTEGER)
RETURNS VOID AS $$
BEGIN
    IF age < 0 THEN
        RAISE EXCEPTION 'Yaş mənfi ola bilməz: %', age;
    END IF;
END;
$$ LANGUAGE plpgsql;

-- Funksiyanın çağırılması
SELECT validate_age(-5);  -- Xəta atacaq

RAISE NOTICE ilə məlumatlandırma

Əgər RAISE EXCEPTION — siqnalizasiyadırsa, RAISE NOTICE — dostcasına çiyninə toxunmaqdır. Bu səviyyə ilə funksiyanın içində nə baş verdiyini anlamaq üçün şərhlər əlavə edə bilərsən.

RAISE NOTICE nə vaxt istifadə etməli:

  • Debug üçün info çıxışı (məsələn, dəyişənlərin cari vəziyyəti).
  • İcra mərhələsinin başlanğıcı və ya nəticəsi barədə mesaj.

Nümunə: info mesajları

CREATE OR REPLACE FUNCTION calculate_discount(price NUMERIC, discount_rate NUMERIC)
RETURNS NUMERIC AS $$
DECLARE
    final_price NUMERIC;
BEGIN
    RAISE NOTICE 'Endirimdən əvvəl qiymət: %', price;
    RAISE NOTICE 'Endirim faizi: %', discount_rate;

    final_price := price - (price * discount_rate);

    RAISE NOTICE 'Son qiymət: %', final_price;

    RETURN final_price;
END;
$$ LANGUAGE plpgsql;

-- Funksiyanın çağırılması
SELECT calculate_discount(100, 0.2);
-- Çıxış:
-- NOTICE: Endirimdən əvvəl qiymət: 100
-- NOTICE: Endirim faizi: 0.2
-- NOTICE: Son qiymət: 80

Praktik tətbiq: planlaşdırma və loglama

Tutaq ki, səndə mürəkkəb data emalı proseduru var və bilmək istəyirsən, indi hansı mərhələdəsən:

CREATE OR REPLACE FUNCTION process_data_step_by_step()
RETURNS VOID AS $$
BEGIN
    RAISE NOTICE 'Addım 1: Datanın hazırlanması';
    -- Birinci mərhələ üçün sənin məntiqin

    RAISE NOTICE 'Addım 2: Datanın validasiyası';
    -- İkinci mərhələ üçün sənin məntiqin

    RAISE NOTICE 'Addım 3: Datanın saxlanması';
    -- Üçüncü mərhələ üçün sənin məntiqin
END;
$$ LANGUAGE plpgsql;

-- Funksiyanın çağırılması
SELECT process_data_step_by_step();
-- Loglarda mərhələ-mərhələ icra görünəcək

Başqa bir nümunə də verək. Təsəvvür elə bir mağaza var, endirim yalnız müəyyən məbləğdən yuxarı sifarişlərə tətbiq olunur:

CREATE OR REPLACE FUNCTION apply_discount(order_amount NUMERIC)
RETURNS NUMERIC AS $$
BEGIN
    IF order_amount < 50 THEN
        RAISE EXCEPTION 'Xəta: sifariş məbləği ən azı 50 olmalıdır, cari məbləğ: %', order_amount;
    END IF;

    RETURN order_amount * 0.9;  -- 10% endirim tətbiq olunur
END;
$$ LANGUAGE plpgsql;

-- Funksiyanın çağırılması
SELECT apply_discount(30);  -- Xəta: sifariş məbləği ən azı 50 olmalıdır

Tipik səhvlər

Səhv 1: parametrlərsiz mesajların loglanması.

Böyük prosedurlarda informativ olmur:

RAISE NOTICE 'Xəta baş verdi';  -- Niyə? Harada? Necə?

Tövsiyə: həmişə kontekst əlavə et:

RAISE NOTICE 'process_data() funksiyasında xəta: daxil olan dəyər: %', input_value;

Səhv 2: RAISE EXCEPTION istifadə etmək, halbuki RAISE WARNING kifayətdir.

Əgər hər şeyə exception atsan, kod hər xırda şeyə görə dayanacaq və data emalı çətinləşəcək.

Məsləhət: log səviyyələrini şüurlu seç. Debug üçün NOTICE, kritik hallar üçün — EXCEPTION.

Səhv 3: ümumiyyətlə loglama olmaması.

Bu, qaranlıq otaqda açar axtarmaq kimidir. Logsuz mürəkkəb prosesləri debug etmək demək olar ki, mümkün deyil.

Məsləhət: xüsusilə böyük və mürəkkəb funksiyalarda əsas mərhələlərdə RAISE NOTICE əlavə et.

2
Tapşırıq
SQL SELF, səviyyə, dərs
Bağlanıb
Məlumatların yoxlanılması zamanı səhvlərin loglaşdırılması
Məlumatların yoxlanılması zamanı səhvlərin loglaşdırılması
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION