C++

C++'da İstisna İşleme

C++'da İstisna İşleme
Var olan üç tür yazılım hatası vardır. Bunlar Sözdizimi Hataları, Mantık Hataları ve Çalışma Zamanı Hatalarıdır.

Sözdizimi Hataları

Yanlış yazılmış bir ifade, ifade veya yapı bir sözdizimi hatasıdır.

Aşağıdaki iki ifadeyi göz önünde bulundurun:

int dizi[] = 1, 2, 3; //doğru
int dizi = 1, 2, 3; //sözdizimi hatası, eksik []

Onlar aynı dizinin tanımlarıdır. İlki doğru. İkincisi [] eksik ve bu bir sözdizimi hatası. Sözdizimi hatası olan bir program derlemeyi başaramaz. Derleme, sözdizimi hatasını gösteren bir hata mesajıyla başarısız oluyor. İşin iyi yanı, programcı ne yaptığını biliyorsa, sözdizimi hatası her zaman düzeltilebilir.

Mantık Hatası

Mantık hatası, bazı yanlış mantıksal kodlamalar yapıldığında programcı tarafından yapılan bir hatadır. Programcının programlama dili özelliklerini bilmemesinden veya programın ne yapması gerektiğinin yanlış anlaşılmasından kaynaklanabilir.

Bu durumda, program başarıyla derlenir. Program iyi çalışıyor, ancak yanlış sonuçlar veriyor. Böyle bir hata, bir döngünün 10 kez yinelenmesi yapıldığında 5 kez yinelenmesinden kaynaklanıyor olabilir. Bir döngü bilinçsizce sonsuza kadar yinelenmek üzere yapılmış da olabilir. Bu tür bir hatayı çözmenin tek yolu, dikkatli bir programlama yapmak ve programı müşteriye teslim etmeden önce iyice test etmektir.

Çalışma Zamanı Hataları

Yanlış veya istisnai girişler çalışma zamanı hatalarına neden olur. Bu durumda, program başarıyla derlendi ve birçok durumda iyi çalışıyor. Belirli durumlarda program çöküyor (ve duruyor).

Bir program kodu segmentinde 8'in bir dizi paydaya bölünmesi gerektiğini hayal edin. Öyleyse, 8 payı payda 4'e bölünürse, cevap (bölüm) 2 olur. Ancak, kullanıcı payda olarak 0 girerse program çökecektir. Matematikte 0'a bölmeye izin verilmez ve hesaplamada da izin verilmez. Programlamada sıfıra bölme önlenmelidir. Özel durum işleme, sıfıra bölme gibi çalışma zamanı hatalarını işler. Aşağıdaki program, C++'daki istisna özelliğini kullanmadan sıfıra bölme sorununun nasıl ele alınacağını gösterir:

#Dahil etmek
ad alanı std kullanarak;
int ana()

int pay = 8;
int payda = 2;
if (payda != 0)

int sonuç = pay/payda;
cout << result << '\n';

Başka

cout << "Division by zero is not permitted!" << '\n';

0 döndür;

çıktı 4. Payda 0 olsaydı, çıktı şöyle olurdu:

"Sıfıra bölmeye izin verilmez!”

Buradaki ana kod bir if-else yapısıdır. Payda 0 değilse bölme gerçekleşir; 0 ise bölme yapılmayacaktır. Kullanıcıya bir hata mesajı gönderilecek ve program çökmeden çalışmaya devam edecektir. Çalışma zamanı hataları genellikle bir kod segmentinin yürütülmesinden kaçınılarak ve kullanıcıya bir hata mesajı gönderilerek ele alınır.

C++'daki istisna özelliği, if bloğu için bir try bloğu ve hatayı işlemek için else bloğu için bir yakalama bloğu kullanır, aynen aşağıdaki gibi:

#Dahil etmek
ad alanı std kullanarak;
int ana()

int pay = 8;
int payda = 2;
Deneyin

if (payda != 0)

int sonuç = pay/payda;
cout << result << '\n';

Başka

0 atmak;


yakalamak (int hata)

eğer (hata == 0)
cout << "Division by zero is not permitted!" << '\n';

0 döndür;

Try başlığının bir argümanı olmadığını unutmayın. Ayrıca, bir fonksiyon tanımı gibi olan yakalama bloğunun bir parametreye sahip olduğuna dikkat edin. Parametre türü, atış ifadesinin işleneni (argümanı) ile aynı olmalıdır. Atma ifadesi, try bloğundadır. Hatayla ilgili programcının seçiminin bir argümanını atar ve yakalama bloğu onu yakalar. Bu şekilde, try bloğundaki kod yürütülmez. Ardından, yakalama bloğu hata mesajını görüntüler.

Bu makale, C'de özel durum işlemeyi açıklar++. C++'da temel bilgi, okuyucunun bu makaleyi anlaması için bir ön koşuldur.

Makale İçeriği:

  • İstisna Atma İşlevi
  • Bir Try-block için birden fazla Catch-Block
  • Yuvalanmış dene/yakala Blokları
  • noexcept belirteci
  • Özel std::terminate() İşlevi
  • Sonuç

İstisna Atma İşlevi:

Bir fonksiyon aynı zamanda try bloğunun yaptığı gibi bir istisna da atabilir. Fırlatma, fonksiyonun tanımı içinde gerçekleşir. Aşağıdaki program bunu göstermektedir:

#Dahil etmek
ad alanı std kullanarak;
void fn(const char* str)

if (islower(str[0]))
'l' atmak;

int ana()

Deneyin

fn("demirci");

yakalamak (char ch)

if (ch == 'l')
cout << "Person's name cannot begin in lowercase!" << '\n';

0 döndür;

Bu sefer try bloğunun sadece fonksiyon çağrısına sahip olduğuna dikkat edin. Fırlatma işlemine sahip olan çağrılan fonksiyondur. Catch bloğu istisnayı yakalar ve çıktı:

“Kişinin adı küçük harfle başlayamaz!”

Bu sefer atılan ve yakalanan tip bir char.

Bir Try-block için birden fazla Catch-Block:

Bir try bloğu için birden fazla yakalama bloğu olabilir. Bir girdinin klavyedeki herhangi bir karakter olabileceği, ancak bir rakam veya bir alfabe olmadığı durumu hayal edin. Bu durumda, iki yakalama bloğu olmalıdır: biri basamağı kontrol etmek için bir tamsayı için ve alfabeyi kontrol etmek için bir karakter için. Aşağıdaki kod bunu göstermektedir:

#Dahil etmek
ad alanı std kullanarak;
karakter girişi = '*';
int ana()

Deneyin

if (isdigit(giriş))
10 atmak;
if (isalpha(girdi))
'z' atmak;

yakalamak (int)

cout << "Digit input is forbidden!" << '\n';

yakalamak (char)

cout << "Character input is forbidden!" << '\n';

0 döndür;

çıktı yok. Giriş değeri bir rakam olsaydı, e.g., '1', çıktı şöyle olurdu:

"Rakam girişi yasaktır!"

Girdi değeri bir alfabe olsaydı, e.g., 'a', çıktı şöyle olurdu:

"Karakter girişi yasaktır!"

İki yakalama bloğunun parametre listesinde tanımlayıcı adı bulunmadığına dikkat edin. Ayrıca, iki yakalama bloğunun tanımında, atılan belirli argümanların değerlerinin kesin olup olmadığının doğrulanmadığına dikkat edin.

Bir av için önemli olan türdür; bir yakalama, atılan işlenenin türüyle eşleşmelidir. Atılan argümanın (işlenenin) belirli değeri, gerekirse daha fazla doğrulama için kullanılabilir.

Aynı Tip için Birden Fazla İşleyici

Aynı türden iki işleyiciye sahip olmak mümkündür. Bir istisna atıldığında, kontrol eşleşen bir tiple en yakın işleyiciye aktarılır. Aşağıdaki program bunu göstermektedir:

#Dahil etmek
ad alanı std kullanarak;
karakter girişi = '1';
int ana()

Deneyin

if (isdigit(giriş))
10 atmak;

yakalamak (int)

cout << "Digit input is forbidden!" << '\n';

yakalamak (int)

cout << "Not allowed at all: digit input!" << '\n';

0 döndür;

Çıktı:

"Rakam girişi yasaktır!"

Yuvalanmış dene/yakala Blokları:

try/catch blokları iç içe yerleştirilebilir. Klavyeden alfasayısal olmayan karakterlerin girişi için yukarıdaki program burada yinelenir, ancak alfabetik hata kodu iç içe geçmiştir:

#Dahil etmek
ad alanı std kullanarak;
karakter girişi = '*';
int ana()

Deneyin

if (isdigit(giriş))
10 atmak;
Deneyin

if (isalpha(girdi))
'z' atmak;

yakalamak (char)

cout << "Character input is forbidden!" << '\n';


yakalamak (int)

cout << "Digit input is forbidden!" << '\n';

0 döndür;

Alfabetik deneme/yakalama bloğu hatası, rakam kodunun deneme bloğunda yuvalanmıştır. Bu programın çalışması ve kopyalandığı önceki işlem aynıdır.

noexcept belirteci

Aşağıdaki işlevi göz önünde bulundurun:

void fn(const char* str) noexcept

if (islower(str[0]))
'l' atmak;

İşlev parametre listesinin sağ parantezinden hemen sonra 'noexcept' belirtecine dikkat edin. Bu, fonksiyonun bir istisna atmaması gerektiği anlamına gelir. Eğer fonksiyon bir istisna atarsa, bu durumda olduğu gibi, bir uyarı mesajı ile derlenir ancak çalışmaz. Programı çalıştırma girişimi std::terminate() özel işlevini çağırır, bu da programı kelimenin tam anlamıyla çökmesine izin vermek yerine zarif bir şekilde durdurması gerekir.

noexcept belirteci farklı biçimlerdedir. Bunlar aşağıdaki gibidir:

func() noexcept yazın; : atma ifadesine izin vermez
func() yazın noexcept(true); : bir atış ifadesine izin verir
func() fırlat() yazın; : atma ifadesine izin vermez
func() yazın noexcept(false); : isteğe bağlı olan bir atma ifadesine izin verir
işlev yazın(); : isteğe bağlı olan bir atma ifadesine izin verir

parantez içindeki doğru veya yanlış, doğru veya yanlış ile sonuçlanan bir ifade ile değiştirilebilir.

Özel std::terminate() İşlevi:

Bir istisna ele alınamazsa, yeniden atılmalıdır. Bu durumda, atılan ifadenin bir işleneni olabilir veya olmayabilir. Özel işlev std::terminate() çalışma zamanında çağrılır, bu da programı tam anlamıyla çökmesine izin vermek yerine zarif bir şekilde durdurmalıdır.

Aşağıdaki programı yazın, derleyin ve çalıştırın:

#Dahil etmek
ad alanı std kullanarak;
karakter girişi = '1';
int ana()

Deneyin

if (isdigit(giriş))
10 atmak;

yakalamak (int)

atmak;

0 döndür;

Başarılı bir derlemeden sonra program çalışmadan sonlandırıldı ve yazarın bilgisayarından gelen hata mesajı:

“'int' örneğini attıktan sonra çağrılan sonlandır

İptal edildi (çekirdek boşaltıldı)”

Sonuç:

C++'daki istisna özelliği, bir tür girdiye dayalı olarak bir kod segmentinin yürütülmesini engeller. Program gerektiği gibi çalışmaya devam eder. İstisna (hata önleme) yapısı, bir deneme bloğu ve bir yakalama bloğundan oluşur. Try bloğu, bazı giriş koşullarına bağlı olarak atlanabilen ilgili kod segmentine sahiptir. Try bloğu, bir işleneni atan atma ifadesine sahiptir. Bu işlenen ayrıca istisna olarak da adlandırılır. İşlenen türü ve yakalama bloğunun parametresinin türü aynıysa, istisna yakalanır (işlenir). İstisna yakalanmazsa, program sonlandırılır, ancak yine de yanlış sonuç verecek kod segmenti yürütülmediği için güvenlidir. Tipik istisna işleme, kod segmentini atlamak ve kullanıcıya bir hata mesajı göndermek anlamına gelir. Kod segmenti normal giriş için yürütülür, ancak yanlış girişler için atlanır.

Wesnoth 1 Savaşı.13.6 Geliştirme Yayınlandı
Wesnoth 1 Savaşı.13.Geçen ay yayınlanan 6. sürüm, 1. sürümdeki altıncı geliştirme sürümüdür.13.x serisi ve özellikle kullanıcı arayüzü için bir dizi i...
Ubuntu 14'te League Of Legends Nasıl Kurulur.04
League of Legends hayranıysanız, bu, League of Legends koşusunu test etmeniz için bir fırsattır. Linux kullanıcısıysanız LOL'nin PlayOnLinux'ta destek...
En son OpenRA Strateji Oyununu Ubuntu Linux'a yükleyin
OpenRA, klasik Command & Conquer: Red Alert gibi erken Westwood oyunlarını yeniden yaratan bir Libre/Free Gerçek Zamanlı Strateji oyun motorudur. Dağı...