CodeGym /Kurslar /C# SELF /finally bloku və throw operatoru

finally bloku və throw operatoru

C# SELF
Səviyyə, Dərs
Mövcuddur

1. finally bloku ilə tanışlıq

Təmizləmə və resursların azad olunması

Təsəvvür elə: sən kimya laboratoriyasında eksperiment aparırsan və hər şey bitəndə (hətta bir-iki kolbanı partlatsan belə), yenə də iş yerini yığışdırmalı, kimyəvi maddələri yuyub, işığı söndürməlisən. Bax, finally bloku da məhz bunun üçündür — o həmişə işləyir, try və catch-dən sonra, fərq etməz istisna olub ya yox.


try
{
    // Burada "təhlükəli" kod yazırıq, hansı ki, istisna ata bilər
}
catch
{
    // Burada istisnaları tutub emal edirik
}
finally
{
    // Bu kod həmişə işləyəcək, istisna olub ya olmayıb
}
C#-da try-catch-finally strukturu

Bunun nə faydası var? Əsas məqsəd — resursların mütləq azad olunmasıdır: faylı bağlamaq, database bağlantısını bağlamaq, server otağının qapısını blokdan çıxarmaq... Əgər finally olmasaydı, səhvdən sonra bəzi resurslar "asılı" qala bilərdi — bu isə artıq real problemdir. Məsələn, fayl bloklanacaq və onu admin belə aça bilməyəcək.

Niyə hər şeyi catch-də yazmaq olmaz?

Bəlkə resursu sadəcə catch-də azad edə bilərik? Teorik olaraq, bəli. Amma hər şey yaxşı keçsə, catch işləməyəcək. Əgər resursun həmişə azad olunacağına əmin olmaq istəyirsənsə, sənə finally lazımdır.

Real həyatda tez-tez belə tapşırıqlar olur ki, uğur olub-olmamasından asılı olmayaraq — təmizlik mütləqdir. Bax, finally də məhz bunun üçün icad olunub.

2. finally blokunun xüsusiyyətləri

finally nə vaxt İŞLƏMİR?

Hiyləgər sualdır! finally həmişə işləyir. Hətta try blokunda return (metoddan erkən çıxış) çağırılsa belə, ya da yeni istisna atılsa, finally yenə də icra olunacaq.


static void Test()
{
    try
    {
        Console.WriteLine("Return-a qədər");
        return;
    }
    finally
    {
        Console.WriteLine("finally yenə də işləyəcək!");
    }
}

//Test() çağırışı
Test();
Çıxış:

// Return-a qədər
// finally yenə də işləyəcək!
    

Amma əgər birdən sənin tətbiqində "sərt çöküş" olsa (məsələn, kompüteri söndürdülər, prosesi öldürdülər və ya bütün CLR öldü), finally bloku işləməyəcək. Burda artıq heç nə etmək olmur.

finally operatoru və çağırış steki

Çağırış stekini biz növbəti dərsdə daha ətraflı öyrənəcəyik, indi isə qısa desək: bu, çağırılmış metodların yığınıdır, proqram uyğun catch tapmayanda "aşağı enir".

Daha bir vacib məqam: əgər try-da istisna baş veribsə, amma catch-də tutulmayıbsa (məsələn, uyğun handler yoxdur), proqram cari metodu tərk edir və çağırış steki ilə yuxarıya doğru gedir, ta ki, uyğun catch tapana qədər. Amma bundan əvvəl hər səviyyədə finally bloku mütləq icra olunacaq.

Bu, resursların hətta qəribə səhvlərdə belə düzgün azad olunmasına zəmanət verir.

3. throw operatoru: istisnaları özün necə ata bilərsən

throw nədir və niyə lazımdır

Bəzən sadəcə istisnanı tutmaq kifayət etmir — olur ki, öz səhvini yaratmaq və onu "atmaq" lazımdır. Məhz bunun üçün throw operatoru yaradılıb.


throw new Exception("Bu mənim xüsusi səhvimdir!");
Öz istisnanı yaratmaq və atmaq

throw sözün əsl mənasında CLR-ə deyir: "Burda nəsə çox pis bir şey gördüm, Exception atıram, bundan sonra qoy bu kodu çağıran özü həll etsin".

Yeni istisna yaratmadan throw istifadə etmək

throw; istifadə etmək olar catch blokunun içində, tutulan istisnanı yenidən atmaq üçün — məsələn, səhvin bir hissəsini emal etmisən, amma qalan məsuliyyəti yuxarıdakı koda ötürmək istəyirsən.


try
{
    DangerousOperation();
}
catch (Exception ex)
{
    LogError(ex);
    throw; // cari istisnanı yenidən atır, çağırış steki saxlanılır
}
Cari istisnanı stek saxlanmaqla yenidən atmaq

Əgər throw ex; yazsaydıq, çağırış steki haqqında məlumat itərdi — bu, pis praktikadır.

4. finally və throw birlikdə necə işləyir?

finally hətta istisna atılanda da işləyir

Gəlin yoxlayaq, nə baş verəcək, əgər try içində throw baş verir, amma həm də finally var:


try
{
    Console.WriteLine("Səhvdən əvvəl...");
    throw new Exception("try zamanı səhv!");
}
catch
{
    Console.WriteLine("Catch səhvi tutur.");
}
finally
{
    Console.WriteLine("Finally işə düşdü.");
}
finally hətta istisna atılanda da işləyir

Nəticə:


Səhvdən əvvəl...
Catch səhvi tutur.
Finally işə düşdü.

Və əgər uyğun catch yoxdursa, finally yenə də proqram çıxmazdan əvvəl işləyəcək.

İncəliklər: əgər finally-də də throw çağırılsa nə baş verər?

Əgər finally içində throw baş verərsə, bu istisna əvvəlkini əvəz edəcək. Yəni, try/catch-də baş verənlər barədə məlumat itəcək. Ona görə də, finally içində throw atmaq məsləhət deyil, əgər içəridə artıq istisna olubsa.


try
{
    throw new Exception("try-də səhv");
}
finally
{
    throw new Exception("finally-də səhv");
}
// Nəticə: çölə "finally-də səhv" çıxacaq
finally-dən atılan istisna əvvəlkini əvəz edir

5. Praktik tövsiyələr və tipik səhvlər

Yeni başlayanlar ən çox nəyi unudurlar

  • Resursları azad edəndə finally blokundan istifadə etməmək, təkcə catch-ə güvənmək.
  • Yeni istisna ata biləcək kodu içəri finally-yə qoymaq — bu, gözlənilməz səhvlərə gətirib çıxarır.
  • return try-da olsa belə, finally-nin həmişə işləyəcəyini unutmaq.

finally üçün alternativ: hansını seçmək?

using konstruksiyası (onu biz bir az sonra ətraflı öyrənəcəyik) çıxandan sonra, resursların azad olunması daha rahat oldu, amma əslində using daxildə yenə də finally-dən istifadə edir. Hər hansı qeyri-standart vəziyyətlərdə (məsələn, blokdan çıxarma və ya səhv barədə mesaj göndərmək) — yenə də finally istifadə etmək lazım gəlir.

finally-ni müsahibələrdə niyə sevirlər

Hər bir recruiter, hansı ki, bir dəfə də olsa yüksək yüklü server yazıb, finally barədə sual verməyi sevir. Adətən soruşurlar: "Nə baş verər, əgər try-da return var, finally-də isə throw?". Ya da "İstisnalarda resursların azad olunmasına zəmanət varmı?". İndi isə səndə sadəcə cavab yox, anlayış var. Sən təkcə finally-nin necə işlədiyini yox, həm də niyə lazım olduğunu, nə vaxt istifadə etmək lazım olduğunu və niyə onsuz ciddi kod yazmaq mümkün olmadığını izah edə biləcəksən.

2
Tapşırıq
C# SELF, səviyyə, dərs
Bağlanıb
finally blokunun sadə istifadəsi
finally blokunun sadə istifadəsi
2
Tapşırıq
C# SELF, səviyyə, dərs
Bağlanıb
İstisnanın təkrar atılması
İstisnanın təkrar atılması
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION