Alıştırma - Özel durum oluşturma ve atma
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.
Visual Studio Code'un yeni bir örneğini açın.
Dosya menüsünde Klasörü Aç'ı seçin.
Klasör Aç iletişim kutusunda Windows Masaüstü klasörünüze gidin.
Klasör Aç iletişim kutusunda Yeni klasör'e tıklayın.
Yeni klasöre ThrowExceptions101 adını verin ve Klasör Seç'i seçin.
Terminal menüsünde Yeni Terminal’i seçin.
Yeni bir konsol uygulaması oluşturmak için bir .NET CLI komutu kullanacaksınız.
TERMINAL paneli komut isteminde aşağıdaki komutu girin:
dotnet new consoleTERMINAL 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.
Program.cs dosyasını açın.
Görünüm menüsünde Komut Paleti'ni seçin.
Komut istemine .net: g yazın ve .NET: Derleme ve Hata Ayıklama için Varlık Oluştur'u seçin.
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; }Kodu gözden geçirmek için bir dakika bekleyin.
Uygulamanın aşağıdaki görevleri gerçekleştirdiğini unutmayın:
Üst düzey deyimleri,
Console.ReadLine()deyimlerini kullanaraklowerBoundveupperBounddeğerlerini elde eder.En üst düzey ifadeler
lowerBoundveupperBound'iAverageOfEvenNumbersyöntemi çağrıldığında bağımsız değişkenler olarak geçirir.AverageOfEvenNumbersyöntemi aşağıdaki görevleri gerçekleştirir:- Hesaplamalarda kullanılan yerel değişkenleri bildirir.
-
forvelowerBoundarasındaki çift sayıları toplamak için birupperBounddöngü kullanır. Toplamsumiçinde depolanır. - Toplama kaç sayının dahil olduğunu sayar. Sayı
countiçinde depolanır. - Toplam sayıların ortalamasını adlı
averagedeğişkende depolar.averagedeğerinin döndürüldüğü belirtilir.
Üst düzey deyimler,
AverageOfEvenNumberstarafı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.
launch.json dosyasını açmak için EXPLORER görünümünü kullanın.
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,internalConsoleolan ve HATA AYIKLAMA KONSOLU paneline hizalanan değerdir. Ne yazık ki HATA AYıKLAMA KONSOLU paneli konsol girişini desteklemez. AyarintegratedTerminal, konsol girişini ve çıkışını destekleyen TERMINAL paneline hizalanır.Değişikliklerinizi launch.json dosyasına kaydedin ve dosyayı kapatın.
Visual Studio Code Çalıştır menüsünde Hata Ayıklamayı Başlat'ı seçin.
TERMINAL paneline geçin.
"Alt sınır" istemine 3 girin
"Üst sınır" istemine 11 girin
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.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.
Sorunu nasıl çözmek istediğinizi düşünmek için bir dakikanızı alır.
Bir seçenek,
averagehesaplamasını birtrykod bloğunun içine sarmalamak ve oluştuğundacatchözel durumunuDivideByZeroetmektir. İ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.
lowerBoundupperBounddeğ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.
Atılacak özel durum türünü değerlendirin.
Sorunla uyumlu iki özel durum türü vardır:
-
ArgumentOutOfRangeException- BirArgumentOutOfRangeExceptionö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 kadarAverageOfEvenNumbers,lowerBoundveyaupperBoundiçin izin verilebilen bir aralığı açıkça tanımlamasa da,lowerBounddeğeriupperBoundiçin izin verilebilen aralığı ifade eder. -
InvalidOperationException: ÖzelInvalidOperationExceptiondurum 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
ArgumentOutOfRangeExceptiondurum türü, yönteme geçen bağımsız değişkenlere göre sınırlandırılmıştır. ÖzelInvalidOperationExceptiondurum 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.AverageOfEvenNumbersyöntemi birArgumentOutOfRangeExceptionözel durum oluşturmalıdır.-
Yöntemin
AverageOfEvenNumbersen ü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;Bir
ArgumentOutOfRangeExceptionözel durum oluşturmak ve atmak için,ifkod 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
ArgumentOutOfRangeExceptionneden 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.
Yukarı kaydırarak en üst düzey deyimlere gelin.
Yöntem çağrısını
AverageOfEvenNumbersveConsole.WriteLinedeyimini birtrykod 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}."); }İlişkili
catchyan tümcesini oluşturmak için aşağıdaki kodu girin:catch(ArgumentOutOfRangeException ex) { }İ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
AverageOfEvenNumberskullanarakupperBoundarayın. -
catchSağlanan yeniupperBounddeğer hala değerinden küçük veya eşitselowerBoundözel duruma geçin.
İstisnayı
catchsürdürmek için bir döngü gerekir.AverageOfEvenNumbersyöntemini en az bir kez çağırmak istediğiniz için birdodöngüsü kullanılmalıdır.tryvecatchbloklarını birdodö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
whiledöngünün çıkış koşulunu tanımlamak için birdoifade gereklidir. Kod bloğunun içeriğidotanımlanmadan önce koşulu belirtmek zordur. Kod bloğunucatchtamamlamak, gereken ifadeyiwhiletanımlamanıza yardımcı olur.Sorunu kullanıcıya açıklamak ve yeni bir
upperBoundalmak içincatchkod 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ş
catchkod 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?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
catchaş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ş
catchkod bloğu iki yol içerir: "çıkış" yolu ve "yeni üst sınır" yolu.Gereken
whileifadesini düşünmek içindodö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.
whileBoole değerini değerlendiren bir ifade kullanılabilir. Örneğin:while (exit == false);Önerilen
whileifade aşağıdaki davranışı oluşturur:-
doBoole değeriexitdeğerine eşit olduğu sürece döngü yinelenirfalse. - Boolean değişkeni
do,exitile eşit olduğundatruedöngüsü tekrarlamayı durdurur.
-
adlı
exitbir Boole değişkeninin örneğini oluşturmak veexitkomutunu kullanarakdodö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);Güncelleştirilmiş kodunuzu kaydedin.
Çalıştır menüsünde Hata Ayıklamayı Başlat'ı seçin.
TERMINAL paneline geçin.
"Alt sınır" istemine 3 girin
"Üst sınır" istemine 3 girin
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):Yeni bir üst sınır istemine 11 girin
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.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.