Alıştırma - Özel durum oluşturma ve atma

Tamamlandı

Geliştiricilerin genellikle bir yöntemin içinden özel durumlar oluşturup, ardından bu özel durumları işlenebileceği çağrı yığınının daha ileride yakalaması gerekir. Özel durum işleme, uygulamalarınızın kararlılığını sağlamanıza yardımcı olur.

Bu alıştırmada, adlı bir yöntem içinde olası bir hata koşulu içeren örnek bir uygulamayla başlayacaksınız. Güncelleştirilmiş yönteminiz sorunu algıladığında bir özel durum oluşturur throw . Özel durum, yöntemini çağıran kodun bir catch bloğunda işlenir. Sonuç, daha iyi bir kullanıcı deneyimi sağlayan bir uygulamadır.

Yeni kod projesi oluşturma

İlk adım, bu modül sırasında kullanabileceğiniz bir kod projesi oluşturmaktır.

  1. Visual Studio Code'un yeni bir örneğini açın.

  2. Dosya menüsünde Klasörü Aç'ı seçin.

  3. Klasör Aç iletişim kutusunda Windows Masaüstü klasörünüze gidin.

  4. Klasör Aç iletişim kutusunda Yeni klasör'e tıklayın.

  5. Yeni klasöre ThrowExceptions101 adını verin ve Klasör Seç'i seçin.

  6. Terminal menüsünde Yeni Terminal’i seçin.

    Yeni bir konsol uygulaması oluşturmak için bir .NET CLI komutu kullanacaksınız.

  7. TERMINAL paneli komut isteminde aşağıdaki komutu girin:

    dotnet new console
    
  8. TERMINAL panelini kapatın.

Örnek uygulamayı gözden geçirme

Örnek bir uygulamayı yüklemek ve gözden geçirmek için aşağıdaki adımları kullanın.

  1. Program.cs dosyasını açın.

  2. Görünüm menüsünde Komut Paleti'ni seçin.

  3. Komut istemine .net: g yazın ve .NET: Derleme ve Hata Ayıklama için Varlık Oluştur'u seçin.

  4. Program.cs dosyasının içeriğini aşağıdaki kodla değiştirin:

    // Prompt the user for the lower and upper bounds
    Console.Write("Enter the lower bound: ");
    int lowerBound = int.Parse(Console.ReadLine());
    
    Console.Write("Enter the upper bound: ");
    int upperBound = int.Parse(Console.ReadLine());
    
    decimal averageValue = 0;
    
    // Calculate the sum of the even numbers between the bounds
    averageValue = AverageOfEvenNumbers(lowerBound, upperBound);
    
    // Display the value returned by AverageOfEvenNumbers in the console
    Console.WriteLine($"The average of even numbers between {lowerBound} and {upperBound} is {averageValue}.");
    
    // Wait for user input
    Console.ReadLine();
    
    static decimal AverageOfEvenNumbers(int lowerBound, int upperBound)
    {
        int sum = 0;
        int count = 0;
        decimal average = 0;
    
        for (int i = lowerBound; i <= upperBound; i++)
        {
            if (i % 2 == 0)
            {
                sum += i;
                count++;
            }
        }
    
        average = (decimal)sum / count;
    
        return average;
    }
    
  5. Kodu gözden geçirmek için bir dakika bekleyin.

    Uygulamanın aşağıdaki görevleri gerçekleştirdiğini unutmayın:

    1. Üst düzey deyimleri, Console.ReadLine() deyimlerini kullanarak lowerBound ve upperBound değerlerini elde eder.

    2. En üst düzey ifadeler lowerBound ve upperBound'i AverageOfEvenNumbers yöntemi çağrıldığında bağımsız değişkenler olarak geçirir.

    3. AverageOfEvenNumbers yöntemi aşağıdaki görevleri gerçekleştirir:

      1. Hesaplamalarda kullanılan yerel değişkenleri bildirir.
      2. for ve lowerBound arasındaki çift sayıları toplamak için bir upperBound döngü kullanır. Toplam sum içinde depolanır.
      3. Toplama kaç sayının dahil olduğunu sayar. Sayı count içinde depolanır.
      4. Toplam sayıların ortalamasını adlı averagedeğişkende depolar. average değerinin döndürüldüğü belirtilir.
    4. Üst düzey deyimler, AverageOfEvenNumbers tarafından konsola döndürülen değeri yazdırır ve ardından yürütmeyi duraklatır.

Hata ayıklama ortamını yapılandırma

Örnek uygulama konsolundan kullanıcı girişini okur. HATA AYıKLAMA KONSOLU paneli, konsoldan gelen girişleri okumayı desteklemez. Bu uygulamayı hata ayıklayıcıda çalıştırabilmek için önce launch.json dosyasını güncelleştirmeniz gerekir.

  1. launch.json dosyasını açmak için EXPLORER görünümünü kullanın.

  2. launch.json dosyasında özniteliğini aşağıdaki gibi güncelleştirin console :

    // For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console
    "console":"integratedTerminal",
    

    console özelliği için varsayılan değer, internalConsole olan ve HATA AYIKLAMA KONSOLU paneline hizalanan değerdir. Ne yazık ki HATA AYıKLAMA KONSOLU paneli konsol girişini desteklemez. Ayar integratedTerminal , konsol girişini ve çıkışını destekleyen TERMINAL paneline hizalanır.

  3. Değişikliklerinizi launch.json dosyasına kaydedin ve dosyayı kapatın.

  4. Visual Studio Code Çalıştır menüsünde Hata Ayıklamayı Başlat'ı seçin.

  5. TERMINAL paneline geçin.

  6. "Alt sınır" istemine 3 girin

  7. "Üst sınır" istemine 11 girin

  8. Uygulamanın aşağıdaki iletiyi görüntüleyip duraklattığına dikkat edin:

    The average of even numbers between 3 and 11 is 7.
    
  9. Uygulamadan çıkmak için Enter tuşuna basın.

AverageOfEvenNumbers yönteminde özel durum oluşturma

AverageOfEvenNumbers yöntemi, alt sınırdan daha büyük bir üst sınır bekliyor. DivideByZero Alt sınır üst sınırdan büyük veya buna eşitse bir hata oluşur.

Alt sınır üst sınırdan büyük veya buna eşit olduğunda bir özel durum oluşturacak şekilde yöntemini güncelleştirmeniz AverageOfEvenNumbers gerekir.

  1. Sorunu nasıl çözmek istediğinizi düşünmek için bir dakikanızı alır.

    Bir seçenek, average hesaplamasını bir try kod bloğunun içine sarmalamak ve oluştuğunda catch özel durumunu DivideByZero etmektir. İstisnayı yeniden fırlatabilir ve sonra çağıran kodda işleyebilirsiniz.

    Bir diğer seçenek de hesaplamaları başlatmadan önce giriş parametrelerini değerlendirmektir. lowerBound upperBound değerinden büyük ya da eşitse bir özel durum oluşturabilirsiniz.

    Hesaplamaları başlatmadan önce parametreleri değerlendirmek ve bir özel durum atmak daha iyi bir seçimdir.

  2. Atılacak özel durum türünü değerlendirin.

    Sorunla uyumlu iki özel durum türü vardır:

    • ArgumentOutOfRangeException - Bir ArgumentOutOfRangeException özel durum türü yalnızca bir bağımsız değişkenin değeri çağrılan yöntem tarafından tanımlanan izin verilebilen değer aralığının dışında olduğunda oluşturulmalıdır. Her ne kadar AverageOfEvenNumbers, lowerBound veya upperBound için izin verilebilen bir aralığı açıkça tanımlamasa da, lowerBound değeri upperBound için izin verilebilen aralığı ifade eder.
    • InvalidOperationException: Özel InvalidOperationException durum türü yalnızca bir yöntemin çalışma koşulları belirli bir yöntem çağrısının başarıyla tamamlanmasını desteklemediğinde oluşturulmalıdır. Bu durumda, çalışma koşulları yönteminin giriş parametreleri tarafından oluşturulur.

    Aralarından seçim yapabileceğiniz iki veya daha fazla özel durum türünüz olduğunda, soruna daha yakından uyan özel durum türünü seçin. Bu durumda, iki özel durum türü soruna eşit olarak hizalanır.

    Sorunla eşit şekilde hizalanmış iki veya daha fazla özel durum türünüz olduğunda, en dar kapsamlı özel durum türünü seçin. Özel ArgumentOutOfRangeException durum türü, yönteme geçen bağımsız değişkenlere göre sınırlandırılmıştır. Özel InvalidOperationException durum türü, yöntemin çalışma koşullarına özgüdür. Bu durumda, ArgumentOutOfRangeException özel durum türü, InvalidOperationException özel durum türüne göre daha dar kapsamlıdır.

    AverageOfEvenNumbers yöntemi bir ArgumentOutOfRangeException özel durum oluşturmalıdır.

  3. Yöntemin AverageOfEvenNumbers en üstünde, üst sınır sorununu algılamak için kodunuzu aşağıdaki gibi güncelleştirin:

    if (lowerBound >= upperBound)
    {
    
    }
    
    int sum = 0;    
    
  4. Bir ArgumentOutOfRangeException özel durum oluşturmak ve atmak için, if kod bloğunu aşağıdaki şekilde güncelleyin:

    if (lowerBound >= upperBound)
    {
        throw new ArgumentOutOfRangeException("upperBound", "ArgumentOutOfRangeException: upper bound must be greater than lower bound.");
    }
    

    Bu kod satırı, özel duruma ve belirtilen hata iletisine ArgumentOutOfRangeException neden olan giriş parametresinin adıyla sınıfın yeni bir örneğini başlatır.

Çağrı kodunda istisnayı yakalama

Özel durumlar, mümkün olduğunda, işlenebildiği çağrı yığını düzeyinde yakalanmalıdır. Bu örnek uygulamada, yönteminin AverageOfEvenNumbers parametreleri çağırma yönteminde (üst düzey deyimler) yönetilebilir.

  1. Yukarı kaydırarak en üst düzey deyimlere gelin.

  2. Yöntem çağrısını AverageOfEvenNumbers ve Console.WriteLine deyimini bir try kod bloğunun içine almak için kodunuzu aşağıdaki gibi güncelleştirin:

    try
    {
        // Calculate the sum of the even numbers between the bounds
        averageValue = AverageOfEvenNumbers(lowerBound, upperBound);
    
        // Display the result to the user
        Console.WriteLine($"The average of even numbers between {lowerBound} and {upperBound} is {averageValue}.");
    }
    
  3. İlişkili catch yan tümcesini oluşturmak için aşağıdaki kodu girin:

    catch(ArgumentOutOfRangeException ex)
    {
    
    }
    
  4. İstisnayı nasıl ele alabileceğinizi düşünmek için bir dakikanızı ayırın.

    Bu özel durumu işlemek için kodunuzun aşağıdakileri yapması gerekir:

    • Sorunu kullanıcıya açıklayın.
    • için upperBoundyeni bir değer alın.
    • Yeni AverageOfEvenNumbers kullanarak upperBound arayın.
    • catch Sağlanan yeni upperBound değer hala değerinden küçük veya eşitse lowerBoundözel duruma geçin.

    İstisnayı catch sürdürmek için bir döngü gerekir. AverageOfEvenNumbers yöntemini en az bir kez çağırmak istediğiniz için bir do döngüsü kullanılmalıdır.

  5. try ve catch bloklarını bir do döngüsünün içine almak için kodunuzu aşağıdaki gibi güncelleyin.

    do
    {
        try
        {
            // Calculate the sum of the even numbers between the bounds
            averageValue = AverageOfEvenNumbers(lowerBound, upperBound);
    
            // Display the result to the user
            Console.WriteLine($"The average of even numbers between {lowerBound} and {upperBound} is {averageValue}.");
        }
        catch (ArgumentOutOfRangeException ex)
        {
    
        }
    }
    

    Bir while döngünün çıkış koşulunu tanımlamak için bir do ifade gereklidir. Kod bloğunun içeriği do tanımlanmadan önce koşulu belirtmek zordur. Kod bloğunu catch tamamlamak, gereken ifadeyi while tanımlamanıza yardımcı olur.

  6. Sorunu kullanıcıya açıklamak ve yeni bir upperBound almak için catch kod bloğunuzu aşağıdaki gibi güncelleyin:

    catch (ArgumentOutOfRangeException ex)
    {
        Console.WriteLine("An error has occurred.");
        Console.WriteLine(ex.Message);
        Console.WriteLine($"The upper bound must be greater than {lowerBound}");
        Console.Write($"Enter a new upper bound: ");
        upperBound = int.Parse(Console.ReadLine());
    }
    

    Güncelleştirilmiş catch kod bloğu sorunu açıklar ve kullanıcının yeni bir üst sınır girmesini gerektirir. Ancak, kullanıcının girmek için geçerli bir üst sınır değeri yoksa ne olur? Kullanıcının bir değer girmek yerine döngüden çıkması gerekiyorsa ne olur?

  7. Kullanıcıya yeni bir üst sınır girmek yerine döngüden çıkma seçeneği sağlamak için kod bloğunuzu catch aşağıdaki gibi güncelleştirin:

    catch (ArgumentOutOfRangeException ex)
    {
        Console.WriteLine("An error has occurred.");
        Console.WriteLine(ex.Message);
        Console.WriteLine($"The upper bound must be greater than {lowerBound}");
        Console.Write($"Enter a new upper bound (or enter Exit to quit): ");
        string? userResponse = Console.ReadLine();
        if (userResponse.ToLower().Contains("exit"))
        {
    
        }
        else
        {
            upperBound = int.Parse(userResponse);
        }
    }
    

    Güncelleştirilmiş catch kod bloğu iki yol içerir: "çıkış" yolu ve "yeni üst sınır" yolu.

  8. Gereken while ifadesini düşünmek için do döngüsüne bir dakikanızı ayırın.

    Kullanıcı istemde "Çıkış" girerse, kod döngüden çıkmalıdır. Kullanıcı yeni bir üst sınır girerse döngü devam etmelidir. while Boole değerini değerlendiren bir ifade kullanılabilir. Örneğin:

    while (exit == false);
    

    Önerilen while ifade aşağıdaki davranışı oluşturur:

    • do Boole değeri exit değerine eşit olduğu sürece döngü yinelenirfalse.
    • Boolean değişkeni do, exit ile eşit olduğunda true döngüsü tekrarlamayı durdurur.
  9. adlı exit bir Boole değişkeninin örneğini oluşturmak ve exit komutunu kullanarak do döngüsünün çıkış koşulunu ayarlamak amacıyla kodunuzu aşağıdaki gibi güncelleyin:

    bool exit = false;
    
    do
    {
        try
        {
            // Calculate the sum of the even numbers between the bounds
            averageValue = AverageOfEvenNumbers(lowerBound, upperBound);
    
            // Display the result to the user
            Console.WriteLine($"The average of even numbers between {lowerBound} and {upperBound} is {averageValue}.");
    
            exit = true;
        }
        catch (ArgumentOutOfRangeException ex)
        {
            Console.WriteLine("An error has occurred.");
            Console.WriteLine(ex.Message);
            Console.WriteLine($"The upper bound must be greater than {lowerBound}");
            Console.Write($"Enter a new upper bound (or enter Exit to quit): ");
            string? userResponse = Console.ReadLine();
            if (userResponse.ToLower().Contains("exit"))
            {
                exit = true;
            }
            else
            {
                exit = false;
                upperBound = int.Parse(userResponse);
            }
        }    
    } while (exit == false);
    
  10. Güncelleştirilmiş kodunuzu kaydedin.

  11. Çalıştır menüsünde Hata Ayıklamayı Başlat'ı seçin.

  12. TERMINAL paneline geçin.

  13. "Alt sınır" istemine 3 girin

  14. "Üst sınır" istemine 3 girin

  15. TERMINAL panelinde aşağıdaki çıkışın görüntülendiğine dikkat edin:

    Enter the lower bound: 3
    Enter the upper bound: 3
    An error has occurred.
    ArgumentOutOfRangeException: upper bound must be greater than lower bound. (Parameter 'upperBound')
    The upper bound must be greater than 3
    Enter a new upper bound (or enter Exit to quit):
    
  16. Yeni bir üst sınır istemine 11 girin

  17. TERMINAL panelinde aşağıdaki çıkışın görüntülendiğine dikkat edin:

    Enter the lower bound: 3
    Enter the upper bound: 3
    An error has occurred.
    ArgumentOutOfRangeException: upper bound must be greater than lower bound. (Parameter 'upperBound')
    The upper bound must be greater than 3
    Enter a new upper bound (or enter Exit to quit): 11
    The average of even numbers between 3 and 11 is 7.
    
  18. Uygulamadan çıkmak için Enter tuşuna basın.

Tebrikler! Bir özel durumu başarıyla fırlattınız, yakaladınız ve işlediniz.

Özet

Bu ünitede hatırlamanız gereken birkaç önemli şey şunlardır:

  • Hata ayıklama ortamınızın uygulama gereksinimlerinizi destekleyecek şekilde yapılandırıldığından emin olun.
  • Bir sorun veya koşul algılandığında yöntem kodu özel durum oluşturmalıdır.
  • Özel durumlar, çağrı yığınında çözümlenebilecekleri bir düzeyde yakalanmalıdır.