C++ İstisna İşleme: Dene, Yakala, At Örnek

İstisna İşleme Nedir? C++?

İstisna yönetimi C++ çalışma zamanı hataları gibi beklenmedik durumlarla başa çıkmanın bir yolunu sunar. Yani beklenmeyen bir durum oluştuğunda program kontrolü, işleyiciler olarak bilinen özel işlevlere aktarılır.

İstisnaları yakalamak için kodun bir bölümünü istisna incelemesine tabi tutarsınız. Kodun bölümü try-catch bloğunun içine yerleştirilir.

Kodun bu bölümünde istisnai bir durum meydana gelirse, bir istisna atılır. Daha sonra istisna işleyicisi programın kontrolünü devralacaktır.

İstisnai bir durumun ortaya çıkmaması durumunda kod normal şekilde çalışacaktır. İşleyiciler göz ardı edilecek.

Bu C++ öğretici, şunları öğreneceksiniz:

Neden İstisna İşleme?

İşte İstisna İşleme'yi kullanmanın nedeni C++:

  • Hata işleme kodunuzu normal kodunuzdan ayıracaksınız. Kod daha okunabilir ve bakımı daha kolay olacaktır.
  • İşlevler seçtikleri istisnaları işleyebilir. Bir işlev birçok istisna atsa bile yalnızca bazılarını ele alır. Arayan, yakalanmamış istisnaları ele alacaktır.

İstisna İşleme Anahtar Kelimeleri

İstisna yönetimi C++ şu üç anahtar kelime etrafında dönmektedir:

  • atmak– Bir program bir sorunla karşılaştığında bir istisna atar. Throw anahtar sözcüğü programın fırlatmayı gerçekleştirmesine yardımcı olur.
  • yakalamak– bir program, bir istisnayı yakalamak için bir istisna işleyicisi kullanır. Bir programın sorunu çözmeniz gereken bölümüne eklenir. Bu, catch anahtar sözcüğü kullanılarak yapılır.
  • denemek– try bloğu, belirli istisnaların etkinleştirileceği kod bloğunu tanımlar. Bunu bir/daha fazla catch bloğu takip etmelidir.

Bir kod bloğunun bir istisna oluşturacağını varsayalım. İstisna, try ve catch anahtar sözcüklerini kullanan bir yöntemle yakalanacaktır. Try/catch bloğu, istisna oluşturabilecek kodu çevrelemelidir. Bu tür kodlara korumalı kod adı verilir.

Sözdizimi

Try/catch şu sözdizimini alır:

try {
   // the protected code
} catch( Exception_Name exception1 ) {
   // catch block
} catch( Exception_Name exception2 ) {
   // catch block
} catch( Exception_Name exceptionN ) {
   // catch block
}
  • Bir try ifademiz olmasına rağmen birçok catch ifademiz olabilir.
  • ExceptionName, yakalanacak istisnanın adıdır.
  • İstisna1, istisna2 ve istisnaN, istisnalara atıfta bulunmak için tanımladığınız adlardır.

Örnek 1:

#include<iostream>
#include<vector>
using namespace std;

int main() {
	vector<int> vec;
	vec.push_back(0);	
	vec.push_back(1);	
	// access the third element, which doesn't exist
	try
	{
		vec.at(2);		
	}
	catch (exception& ex)
	{
		cout << "Exception occurred!" << endl;
	}
	return 0;
}

Çıktı:

İstisna İşleme Anahtar Kelimeleri

İşte kodun ekran görüntüsü:

İstisna İşleme Anahtar Kelimeleri

Kod Açıklaması:

  1. Kullanmak için iostream başlık dosyasını programa ekleyin. fonksiyonlar.
  2. İşlevlerini kullanmak için vektör başlık dosyasını programa ekleyin.
  3. Programdaki std ad alanını çağırmadan sınıflarına ekleyin.
  4. Main() işlevini çağırın. Program mantığı kendi bünyesinde eklenmelidir.
  5. Tamsayı verilerini depolamak için vec adında bir vektör oluşturun.
  6. 0 elemanını vec adlı vektöre ekleyin.
  7. 1 elemanını vec adlı vektöre ekleyin.
  8. Bir yorum. Tarafından atlanacak C++ derleyici.
  9. Bir istisnayı yakalamak için try ifadesini kullanın. {, try/catch bloğunun gövdesinin başlangıcını işaret eder. Gövde içine eklenen kod korumalı kod haline gelecektir.
  10. Vec isimli vektörün indeks 2'sinde (üçüncü eleman) saklanan elemana erişmeye çalışın. Bu öğe mevcut değil.
  11. Try/catch bloğunun gövdesinin sonu.
  12. İstisnayı yakalayın. Döndürülen hata mesajı ex değişkeninde saklanacaktır.
  13. İstisna yakalanırsa konsoldaki bazı mesajları yazdırın.
  14. Catch bloğunun gövdesinin sonu.
  15. Program başarılı bir şekilde yürütüldüğünde bir değer döndürmelidir.
  16. main() işlev gövdesinin sonu.

Örnek 2:

#include <iostream>
using namespace std;
double zeroDivision(int x, int y) {

	if (y == 0) {
		throw "Division by Zero!";
	}
	return (x / y);
}

int main() {
	int a = 11;
	int b = 0;
	double c = 0;

	try {
		c = zeroDivision(a, b);
		cout << c << endl;
	}
	catch (const char* message) {
		cerr << message << endl;
	}
	return 0;
}

Çıktı:

İstisna İşleme Anahtar Kelimeleri

İşte kodun ekran görüntüsü:

İstisna İşleme Anahtar Kelimeleri

Kod Açıklaması:

  1. İşlevlerini kullanmak için iostream başlık dosyasını programa ekleyin.
  2. Programdaki std ad alanını çağırmadan sınıflarına ekleyin.
  3. İki tam sayı argümanı, x ve y alan zeroDivision adlı bir fonksiyon oluşturun. Fonksiyon bir double sonuç döndürmelidir.
  4. Y değişken argümanının değerinin 0 olup olmadığını kontrol etmek için bir if ifadesi kullanın. {, if gövdesinin başlangıcını işaretler.
  5. Y 0 ise döndürülecek/atılacak mesaj.
  6. If ifadesinin gövdesinin sonu.
  7. ZeroDivision işlevi x/y değerini döndürmelidir.
  8. ZeroDivision işlevinin gövdesinin sonu.
  9. main() yöntemini çağırın. { bu yöntemin başlangıcını işaret eder.
  10. Bir tamsayı değişkeni bildirin ve ona 11 değerini atayın.
  11. Bir tamsayı değişkeni b bildirin ve ona 0 değerini atayın.
  12. c adında bir double değişken tanımlayıp bu değişkene 0 değerini atayın.
  13. Bir istisnayı yakalamak için try ifadesini kullanın. {, try/catch bloğunun gövdesinin başlangıcını işaret eder. Gövde içine eklenen kod korumalı kod haline gelecektir.
  14. ZeroDivision fonksiyonunu çağırın ve a ve b argümanlarına, yani 11 ve 0'a geçin. Bu işlemin sonucu c değişkeninde saklanacaktır.
  15. Konsolda c değişkeninin değerini yazdırın.
  16. Try/catch bloğunun gövdesinin sonu.
  17. İstisnayı yakalayın. Döndürülen hata mesajı değişken mesajda saklanacaktır.
  18. Döndürülen hata mesajını konsola yazdırın.
  19. Catch bloğunun gövdesinin sonu.
  20. Program başarılı bir şekilde yürütüldüğünde bir değer döndürmelidir.
  21. main() işlev gövdesinin sonu.

C++ Standart İstisnalar

C++ Standart İstisnalar

C++ tanımlanan standart istisnaların bir listesiyle birlikte gelir. sınıf. Bunlar aşağıda açıklanmıştır:

Istisna Açıklamalar
std::istisna Bu bir istisnadır ve tüm standartların ana sınıfıdır. C++ istisnalar.
std::bad_alloc Bu istisna yeni bir anahtar kelime tarafından atılır.
std::bad_cast Bu, Dynamic_cast tarafından oluşturulan bir istisnadır.
std::bad_istisna Beklenmeyen istisnaları ele almak için kullanışlı bir cihaz C++ programları.
std::bad_typeid Typeid tarafından oluşturulan bir istisna.
std::logic_error Bu istisna teorik olarak kod okunarak tespit edilebilir.
std::domain_error Bu, matematiksel olarak geçersiz bir etki alanı kullanıldıktan sonra ortaya çıkan bir istisnadır.
std::geçersiz_argument Geçersiz bağımsız değişkenlerin kullanılması nedeniyle oluşturulan bir istisna.
std::length_error Büyük bir std::string oluşturulduktan sonra oluşan bir istisna.
std::aralığın_dışında Yöntemle atıldı.
std::runtime_error Bu, kod okunarak tespit edilemeyen bir istisnadır.
std::overflow_error Bu istisna, matematiksel bir taşma meydana geldikten sonra atılır.
std::range_error Bu istisna, aralık dışında bir değer depolamaya çalıştığınızda ortaya çıkar.
std::underflow_error Matematiksel yetersiz akışın ortaya çıkmasından sonra atılan bir istisna.

Kullanıcı Tanımlı İstisnalar

The C++ std:: Exception sınıfı, istisna olarak atılabilecek nesneleri tanımlamamıza olanak tanır. Bu sınıf şu şekilde tanımlanmıştır: başlık. Sınıf bize What adında bir sanal üye işlevi sağlar.

Bu işlev char * türünde boş sonlandırılmış bir karakter dizisi döndürür. Bir istisna açıklamasına sahip olmak için türetilmiş sınıflarda bunun üzerine yazabiliriz.

Örnek:

#include <iostream>
#include <exception>
using namespace std;

class newException : public exception
{
	virtual const char* what() const throw()
	{
		return "newException occurred";
	}
} newex;

int main() {

	try {
		throw newex;
		}
	catch (exception& ex) {
		cout << ex.what() << '\n';
	}
	return 0;	
}

Çıktı:

Kullanıcı Tanımlı İstisnalar

İşte kodun ekran görüntüsü:

Kullanıcı Tanımlı İstisnalar

Kod Açıklaması:

  1. iostream başlık dosyasını programımıza ekleyin. Fonksiyonlarını hata almadan kullanacağız.
  2. İstisna başlık dosyasını programımıza ekleyin. Fonksiyonlarını hatasız olarak kullanacağız.
  3. Sınıflarını çağırmadan kullanmak için programımıza std ad alanını ekleyin.
  4. newExceptionadlı yeni bir sınıf oluşturun. Bu sınıf istisna sınıfını miras alır C++.
  5. Sınıf gövdesinin başlangıcı.
  6. İstisna başlık dosyasında tanımlanan sanal üye işlevinin (what()) üzerine yazın. Daha sonra kendi istisnamızı, yeni istisnayı tanımlayacağız.
  7. Yeni istisnanın tanımını başlatın.
  8. Yeni istisnanın yakalanması durumunda döndürülecek mesaj.
  9. Yeni istisnanın tanımının sonu.
  10. newException sınıfının gövdesinin sonu. Newex, yeni istisnamızı yakalamak için kullanılacak addır ve bundan sonra newException çağrılacaktır.
  11. Main() işlevini çağırın. Program mantığı kendi bünyesinde eklenmelidir. { gövdesinin başlangıcını işaret eder.
  12. İstisnayı işaretlememiz gereken kodu işaretlemek için try ifadesini kullanın. {, try/catch bloğunun gövdesinin başlangıcını işaret eder. Bununla çevrelenen kod korunacaktır.
  13. Yakalanırsa newex istisnasını atın.
  14. Deneme gövdesinin sonu.
  15. İstisnayı yakalamak için catch ifadesini kullanın. İstisna hata mesajı ex değişkeninde saklanacaktır.
  16. İstisna hata mesajını konsola yazdırın.
  17. Catch ifadesinin gövdesinin sonu.
  18. Program başarılı bir şekilde yürütülürse bir değer döndürmelidir.
  19. Main() işlevinin gövdesinin sonu.

ÖZET

  • İstisna yönetimi ile C++, çalışma zamanı hatalarını işleyebilirsiniz.
  • Çalışma zamanı hataları, programın yürütülmesi sırasında ortaya çıkan hatalardır.
  • İstisna yönetimi, programınızdaki beklenmeyen durumlarla başa çıkmanıza yardımcı olur.
  • Beklenmedik bir durum oluştuğunda program kontrolü işleyicilere aktarılır.
  • Bir istisnayı yakalamak için try-catch bloğunun altına bir kod bölümü yerleştirirsiniz.
  • throw anahtar sözcüğü programın istisnalar atmasına yardımcı olarak programın sorunu çözmesine yardımcı olur.
  • Try anahtar sözcüğü, belirli istisnaların etkinleştirileceği kod bloğunun tanımlanmasına yardımcı olur.
  • İstisnalarımızı tanımlamak için istisna başlık dosyasının What() fonksiyonunun üzerine yazabiliriz.