CodeGym /Kurslar /C# SELF /try-catch sintaksisi: error-ların işlənməsi

try-catch sintaksisi: error-ların işlənməsi

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

1. Giriş

İdeal dünyada kod da ideal olmalıdır. Amma, təəssüf ki, hətta ən diqqətli proqramçı da bir gün gözlənilməz situasiyalarla rastlaşacaq: fayl tapılmadı, istifadəçi rəqəm əvəzinə sətir daxil etdi, şəbəkə qəfil işləmədi, ya da database-dən nəsə gözlənilməyən bir şey gəldi.

Əgər belə problemləri tutmasaq — proqram sadəcə "çökəcək", bəzən də anlaşılmaz error mesajı və stack trace (çağırışlar steki) ilə. Bu nə istifadəçinin, nə də gələcək support komandasının istədiyi şeydir. Belə error-ları "tutmağı" və onlara reaksiya verməyi öyrənmək lazımdır: proqramı sakitcə bağlamaq, insan üçün başa düşülən mesaj göstərmək və ya hətta vəziyyəti yerindəcə düzəltmək.

try-catch — bu, kompilyatora və runtime-a deməkdir: "Bu kod hissəsini icra etməyə çalış. Problem olsa, panik etmə, mənə imkan ver, baxım nə baş verir!"

2. try-catch üçün əsas sintaksis

Ümumi struktur çox sadədir:


try
{
    // Burada təhlükəli (və ya potensial təhlükəli) kod yazırıq
}
catch (ExceptionType variableName)
{
    // Burada ExceptionType tipli exception baş verərsə, nə etmək lazımdır yazırıq
}
try-catch üçün əsas sintaksis
  • try bloku — "təhlükəli zona"dır. Ora potensial "partlaya" biləcək əməliyyatları yerləşdiririk.
  • catch bloku — müəyyən tipli exception-ları tutur. Əgər try içində exception baş verərsə, idarəetmə dərhal uyğun catch-ə keçir və try-da "problemli yer"dən sonrakı kod artıq icra olunmur.

Nümunə: sadə exception işlənməsi

Tutaq ki, keçən dərslərdəki mini-kalkulyatorumuz artıq ədədləri bölə bilir. Amma istifadəçi sıfır daxil edə bilər! Baxaq, error işlənməsi olmadan bu necə işləyir:

int a = 10;
int b = 0;
int result = a / b; // BUM! System.DivideByZeroException
Console.WriteLine(result);

Proqram DivideByZeroException error-u ilə qəza ilə bağlanacaq:

Unhandled exception. System.DivideByZeroException: Attempted to divide by zero.

İndi isə bunu try-catch ilə "düzəldək":

int a = 10;
int b = 0;

try
{
    int result = a / b; // təhlükəli əməliyyat
    Console.WriteLine("Bölmənin nəticəsi: " + result);
}
catch (DivideByZeroException ex)
{
    Console.WriteLine("Ayy! Sıfıra bölmək mümkün deyil: " + ex.Message);
}

İndi proqram "çökməyəcək". Konsolda sıfıra bölmənin mümkün olmaması barədə mesaj çıxacaq:

Ayy! Sıfıra bölmək mümkün deyil: Attempted to divide by zero.

3. try-catch necə işləyir: addım-addım

Əslində try içində istədiyin qədər kod sətiri ola bilər. Əgər blokdakı əməliyyatlardan biri exception atarsa, idarəetmə dərhal ən yaxın uyğun catch-ə keçir. Xəta yerindən sonra try blokunda yazılanlar artıq icra olunmayacaq.

Daha böyük bir nümunəyə baxaq:

try
{
    Console.WriteLine("Başlayırıq...");
    int[] numbers = { 1, 2, 3 };
    Console.WriteLine(numbers[1]);    // bu ok-dur
    Console.WriteLine(numbers[5]);    // xəta: massivdən kənar indeks
    Console.WriteLine("Bu mesaj artıq görünməyəcək!");
}
catch (IndexOutOfRangeException)
{
    Console.WriteLine("Xəta: Massivin mövcud olmayan elementinə müraciət cəhdi");
}

Konsolda çıxış belə olacaq:

Başlayırıq...
2
Xəta: Massivin mövcud olmayan elementinə müraciət cəhdi

Process finished with exit code 0.

Bu proqram necə işləyir?

  • "Başlayırıq..." mesajı çıxır.
  • Sonra proqram numbers[1] elementini çıxarmağa çalışır — bu 2-dir.
  • numbers[5]-ə çatanda "qəza" baş verir və IndexOutOfRangeException atılır.
  • Proqram dərhal catch blokuna keçir, Console.WriteLine("Bu mesaj artıq görünməyəcək!"); sətrini atlayır.
  • Konsolda bizim catch-dən olan mesaj çıxır.

4. Müxtəlif error tiplərini fərqli işləmək olar?

Bəli! Bir neçə catch bloku yaza bilərik ki, müxtəlif exception tiplərinə fərqli reaksiya verək. Bu rahatdır: məsələn, bir əməliyyat fayl oxumaqla bağlıdırsa (FileNotFoundException ola bilər), digəri isə bölmə ilə (DivideByZeroException ola bilər).

try
{
    // Sənin təhlükəli kodun
}
catch (DivideByZeroException)
{
    Console.WriteLine("Sıfıra bölmə xətası");
}
catch (IndexOutOfRangeException)
{
    Console.WriteLine("Xəta: massiv diapazonundan kənar indeks");
}
catch (Exception ex)
{
    Console.WriteLine("Gözlənilməz bir xəta: " + ex.Message);
}

Burada sonuncu catch bloku Exception tipi ilə — "universal tutucu"dur. O, əvvəlki bloklara uyğun gəlməyən bütün digər exception-ları tutacaq. Amma yadında saxla: əgər onu birinci yazsan, qalanları ona çatmayacaq! Həmişə "geniş" catch-ləri sona qoy.

5. Exception obyekti necə görünür?

catch blokunda istəyə görə dəyişən göstərə bilərik — məsələn, catch (Exception ex). O, baş vermiş error barədə bütün məlumatı saxlayır: mesaj, error tipi, stack trace, nested exception-lar.

Kiçik bir nümunə:

try
{
    string? text = null;
    Console.WriteLine(text.Length); // Hoppa! NullReferenceException
}
catch (NullReferenceException ex)
{
    Console.WriteLine("Tutulan exception: " + ex.Message);
    Console.WriteLine("Stack trace: " + ex.StackTrace);
}

Belə yanaşma — çətin error-ları debug edəndə xilas edir: həmişə görə biləcəksən, proqram harada və niyə "yıxıldı".

6. Error-u tutub işi davam etdirmək

Real, xüsusilə istifadəçi proqramlarında error — dünyanın sonu deyil. Adam fayl yolunu səhv yazıb, olur da. Bu, proqramı isterikada yenidən başlatmaq üçün səbəb deyil. Əvəzində, sadəcə ondan yenidən cəhd etməsini xahiş edirik.

Aşağıdakı nümunə sadə, amma işlək yanaşmanı göstərir: fayl oxumağı loop-a salırıq, nəsə düz getməsə, error barədə məlumat veririk və yenidən cəhd etməyi istəyirik. Nə panika, nə də qırmızı ekranlar.

bool success = false;
while (!success)
{
    Console.Write("Fayl adını daxil et: ");
    string fileName = Console.ReadLine() ?? "";

    try
    {
        string content = File.ReadAllText(fileName);
        Console.WriteLine("Fayl uğurla oxundu!");
        success = true; // UĞUR!
    }
    catch (FileNotFoundException)
    {
        Console.WriteLine("Xəta: fayl tapılmadı. Yenidən cəhd et.");
    }
}

Burada əsas ideya — sadəcə exception-u tutmaq yox, onu düzgün işləməkdir: proqramın çöküşünə imkan vermirik, onu "yenidən, amma bu dəfə düz" rejiminə keçiririk. İstifadəçi başa düşülən hint alır, proqram ikinci şans, sən isə təşəkkür və hörmət.

7. try-catch ilə işləyərkən tipik səhvlər

Səhv №1: Bütün kodu bir universal try-catch-ə bürümək.
Bu cazibədar görünür — bir try, bir catch (Exception) və guya "hər şey qorunur". Amma əslində nəzarəti itirirsən. Harada problem baş verdiyini və hansı error-a reaksiya verdiyini başa düşmək olmur. Nəticədə, etibarlılıq əvəzinə tam diaqnostika itkisi olur.

Səhv №2: Exception-ları tutub heç nə etməmək.
Həyatdan nümunə:

try
{
    // nəsə potensial təhlükəli
}
catch
{
    // səssizlik...
}
Belə kod sözün əsl mənasında deyir: "Nəsə düz getmədi... boş ver". Bu təhlükəlidir: proqram səhv vəziyyətdə işləməyə davam edə bilər və sənin error-dan xəbərin belə olmaz. Heç olmasa mesaj ver və ya error-u log-a yaz. Heç vaxt boş catch yazma!

Səhv №3: Çox ümumi exception tipini tutmaq.
Əgər sən Exception tutursansa, halbuki bilirsən ki, məsələn, FormatException və ya FileNotFoundException ola bilər, — konkret problemə düzgün reaksiya vermək imkanını itirirsən. Sənin catch nə qədər dar və dəqiq olsa, proqram qeyri-standart situasiyada bir o qədər proqnozlaşdırıla və düzgün davranacaq.

8. Exception-lardan İSTİFADƏ ETMƏK TÖVSİYƏ OLUNMUR halları

Bəzən beginner-lər exception-ları... adi məntiq idarəetmə mexanizmi kimi istifadə etməyə başlayır, məsələn:

try
{
    if (x < 0) throw new Exception("x 0-dan böyük və ya bərabər olmalıdır");
}
catch (Exception)
{
    // vəziyyəti geri qaytar, işi davam etdir...
}

Belə etmək olmaz! Exception-lar gözlənilməz, nadir hallarda (fayl oxuma xətası, şəbəkə problemi və s.) üçün alətdir, istifadəçi məlumatının düzgünlüyünü yoxlamaq üçün yox. Belə hallarda şərt operatorlarından (if, else) istifadə et və nəsə düz getmirsə, xüsusi dəyər qaytar.

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