C Gömülü Programlama konularımız yayında...
C++'da Hata kontrolü (Exception handling) sistemi ile çalışma zamanı hatalarını düzenli bir şekilde yönetmemizi sağlar. Program çalışırken bir hata ile karşılaştığında, otomatik olarak bir hata kontrol kod bloğunu devreye sokar. Hata kontrol kodlarının bir kısmı sistem tarafından otomatik olarak sağlanmasıdır.
Hata kontrolünde try, catch ve throw anahtar kelimeleri kullanılmaktadır. Hata kontrolü için izlemek istediğimiz program kodları bir try bloğunda yer alır. Try bloğu içinde bir hata meydana gelirse, throw anahtar kelimesi ile veri türüne bağlı olarak tanımlanan bir catch kod bloğunda işlem yapılmak üzere gönderilir. Catch anahtar kelimesi hatayı alır ve gerekli işlemleri yapar.
Try ve catch bloğunun tanımlanmasında, farklı veri türlerinin her biri için bir catch kod bloğu olmak üzere veya tüm veri türleri için tek bir catch bloğu olmak üzere iki farklı yöntem kullanılabilir. İlk yöntemde, try kod bloğu içinde karşılaşılan hata kodu veri türüne uygun olarak farklı bir catch kod bloğu seçilir. İkinci yöntemde ise, hata kodunun veri türü ne olursa olsun hata kodu aynı catch bloğuna gönderilir. Ancak, bu durumda gönderilen hata kodu catch bloğu içinde kullanılamaz.
Throw anahtar kelimesi kullanımının genel yapısı aşağıda gösterilmektedir:
throw hata-kodu;
Throw anahtar kelimesi, belirli bir veri türünden olan hata-kodu ile gösterilen hatayı oluşturur. Eğer bu hata koduna işlem yapılması gerekirse, hata kodunun veri türüne uygun olarak seçilen catch kod bloğunda doğrudan kod satırı veya fonksiyon çağrısı ile işlem yapılır.
Hata kodunun veri türüne işlem yapacak herhangi bir catch bloğu tanımlanmamış ise, program anormal bir şekilde sonlandırılabilir. Hata koduna herhangi bir işlem yapılmadığından, standart kütüphane fonksiyonu olan terminate() fonksiyonu devre girer ve abort() fonksiyonunu çağırır.
Try ve catch bloğu bildiriminde, try bloğunda throw anahtar kelimesi ile gönderilecek her bir veri türü için ayrı bir catch kod bloğu tanımladığımızda kullanılacak olan genel yapı aşağıda gösterilmektedir.
try { // try kod bloğu throw hata-kodu // hata-kodu -> parametre } catch (veri-türü1 parametre) { // catch kod bloğu } catch (veri-türü2 parametre) { // catch kod bloğu } catch (veri-türü3 parametre) { // catch kod bloğu } . . . catch (veri-türüN parametre) { // catch kod bloğu }
Bu yöntemle yapılan tanımlamaada, bir try catch bloğunda birden fazla catch bloğu yer alabilir. Try kod bloğu içinde throw anahtar kelimesi ile bir hata kodu gönderildiğinde, hata kodunun veri türüne karşılık gelen catch anahtar kelimesinin bulunduğu kod bloğu tarafından işlem yapılır.
Bir hata alındığında, hata kodu tanımlandığı veri tüürne bağlı olarak, catch bloğu başında tanımlanan parametreye aktarılacaktır. Try kod bloğu içinde herhangi bir hata ile karşılaşılmadığı takdirde, catch kod bloklarından hiçbiri devreye girmez.
Şimdi, her bir veri türü için ayrı bir catch kod bloğu tanımlanan try ve catch bloğunun hata kontrol sisteminde çalışmasını bir örnek üzerinde incelemeye çalışalım:
#include<iostream>
using namespace std;
int main(void)
{
int id;
cout << "1-100 arasında bir sayı giriniz: ";
cin >> id;
try {
if (id >= 1 && id <= 100) {
cout << endl << "Girdiğiniz sayı 1-100 arasındadır!" << endl;
}
else {
throw id;
}
}
catch (int idc) {
cout << endl << "Girdiğiniz sayı 1-100 arasında değildir!" << endl;
cout << "Girdiğiniz sayı: " << idc;
}
return 0;
}
Yukarıdaki programı derleyip çalıştırdığımız zaman, 21 sayısını girip ENTER tuşuna bastığımızda, aşağıdaki ifadeleri ekrana yazar:
1-100 arasında bir sayı giriniz: 21 Girdiğiniz sayı 1-100 arasındadır!
125 sayısını girip ENTER tuşuna bastığımızda ise, aşağıdaki ifadeleri ekrana yazar:
1-100 arasında bir sayı giriniz: 125 Girdiğiniz sayı 1-100 arasında değildir! Girdiğiniz sayı: 125
Program, önce kullanıcıdan 1-100 arasında bir sayı girmesini ister. Sonra, try kod bloğunun içinde, sayının 1-100 arasında olup olmadığını kontrol eder. Eğer girilen değer belirtilen aralıkta ise, "Girdiğiniz sayı 1-100 arasındadır!" ifadesini ekrana yazar ve catch kod bloğuna giriş yapılmadan programın çalışması sona erer. Eğer girilen değer belirtilen aralıkta değil ise, throw anahtar kelimesi ile girilen değer kullanılarak int değer için oluşturulan catch kod bloğu çağrılır. Kod bloğu içinde, "Girdiğiniz sayı 1-100 arasında değildir!" ifadesini ve girilen değeri ekrana yazar ve programın çalışması sona erer.