try, throw ve catch Deyimleri (C++)

C++'da özel durum işleme uygulamak için , throwve catch ifadelerini kullanırsınıztry.

İlk olarak, özel durum oluşturabilecek bir try veya daha fazla deyimi kapsayan bir blok kullanın.

İfade throw , bir blokta try olağanüstü bir koşulun (genellikle bir hata) oluştuğunu belirtir. herhangi bir türde bir nesneyi bir ifadenin işleneni throw olarak kullanabilirsiniz. Genellikle, bu nesne, hata hakkında bilgi iletmek için kullanılır. Çoğu durumda, standart kitaplıkta std::exception tanımlanan sınıfını veya türetilmiş sınıflardan birini kullanmanızı öneririz. Bunlardan biri uygun değilse, kendi özel durum sınıfınızı öğesinden std::exceptiontüretmenizi öneririz.

Oluşturulabilecek özel durumları işlemek için, bir bloğun hemen ardından bir try veya daha fazla catch blok uygulayın. Her catch blok işleyebileceği özel durum türünü belirtir.

Bu örnekte bir try blok ve işleyicileri gösterilmektedir. GetNetworkResource() Ağ bağlantısı üzerinden veri aldığını ve iki özel durum türünün'den std::exceptiontüretilen kullanıcı tanımlı sınıflar olduğunu varsayalım. Özel durumların deyimindeki catch başvuru tarafından const yakalandığını fark edin. Özel durumları değere göre oluşturmanız ve sabit başvuruya göre yakalamanız önerilir.

Örnek

MyData md;
try {
   // Code that could throw an exception
   md = GetNetworkResource();
}
catch (const networkIOException& e) {
   // Code that executes when an exception of type
   // networkIOException is thrown in the try block
   // ...
   // Log error message in the exception object
   cerr << e.what();
}
catch (const myDataFormatException& e) {
   // Code that handles another exception type
   // ...
   cerr << e.what();
}

// The following syntax shows a throw expression
MyData GetNetworkResource()
{
   // ...
   if (IOSuccess == false)
      throw networkIOException("Unable to connect");
   // ...
   if (readError)
      throw myDataFormatException("Format error");
   // ...
}

Açıklamalar

Yan tümceden try sonraki kod, kodun korunan bölümüdür. İfade throwbir özel durum oluşturur; yani oluşturur. Yan tümceden catch sonraki kod bloğu özel durum işleyicidir. ve ifadelerindeki türler throwcatch uyumluysa, oluşan özel durumu yakalayan işleyici budur. Bloklarda catch tür eşleştirmeyi yöneten kuralların listesi için bkz . Catch Blokları Nasıl Değerlendirilir? catch deyimi bir tür yerine üç nokta (...) belirtirse, catch blok her özel durum türünü işler. seçeneğiyle /EHa derlediğinizde, bunlar C yapılandırılmış özel durumları ve bellek koruması, sıfıra bölme ve kayan nokta ihlalleri gibi sistem tarafından oluşturulan veya uygulama tarafından oluşturulan zaman uyumsuz özel durumları içerebilir. catch Bloklar eşleşen bir türü bulmak için programda işlendiği için, üç nokta işleyicisi ilişkili try bloğun son işleyicisi olmalıdır. Dikkatli kullanın catch(...) ; catch bloğu yakalanan özel durumun nasıl işleneceğini bilmediği sürece bir programın devam etmesine izin verme. Genellikle, program yürütme durdurulmadan önce hataları günlüğe kaydetmek ve özel temizleme gerçekleştirmek için bir catch(...) blok kullanılır.

İşleneni throw olmayan bir ifade, şu anda işlenmekte olan özel durumu yeniden oluşturur. Özgün özel durumun polimorfik tür bilgilerini koruduğundan, özel durumu yeniden oluştururken bu formu öneririz. Böyle bir ifade yalnızca işleyicide catch veya işleyiciden çağrılan bir catch işlevde kullanılmalıdır. Yenidenrown özel durum nesnesi, kopya değil özgün özel durum nesnesidir.

try {
   throw CSomeOtherException();
}
catch(...) {
   // Catch all exceptions - dangerous!!!
   // Respond (perhaps only partially) to the exception, then
   // re-throw to pass the exception to some other handler
   // ...
   throw;
}

Ayrıca bkz.

Özel durumlar ve hata işleme için modern C++ en iyi yöntemleri
Anahtar Sözcükler
İşlenilmeyen C++ Özel Durumları
__uncaught_exception