Aracılığıyla paylaş


try, throw ve catch Deyimleri (C++)

C++'ta özel durum işlemesi uygulamak için, try, throw ve catch ifadelerini kullanırsınız.

Öncelikle, bir özel durum oluşturabilecek bir veya daha fazla deyimi içermek için bir try bloğu kullanın.

Bir throw ifadesi, try bloğunda olağanüstü bir koşul, genellikle bir hata oluştuğunun uyarısını verir.Bir throw ifadesinin işleneni olarak herhangi bir türde bir nesne kullanabilirsiniz.Genellikle, bu nesne, hata hakkında bilgi iletmek için kullanılır.Çoğu durumda, std::exception sınıfını veya standart kitaplıkta tanımlanan türetilmiş sınıflardan birini kullanmanız önerilir.Bunlardan biri uygun değilse, std::exception öğesinden gelen kendi özel durum sınıfınızdan bir adet türetmeniz önerilir.

Oluşabilecek özel durumları işlemek için, bir try bloğunun ardından hemen bir veya daha fazla catch bloğu uygulayın.Her bir catch bloğu işleyebileceği özel durumun türünü belirtir.

Bu örnek, bir try bloğunu ve ona ait işleyiciyi göstermektedir.GetNetworkResource() öğesinin bir ağ bağlantısı üzerinden veri aldığını ve iki özel durum türünün std::exception öğesinden türetilen kullanıcı tanımlı sınıflar olduklarını varsayalım.Özel durumların catch ifadesindeki const başvurusu tarafından yakalandığını görürsünüz.Ö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"); 
   // ...
}

Notlar

try yan tümcesinden sonraki kod kodun korunan bölümüdür.throw ifadesi bir özel durum oluşturur, diğer bir deyişle bir özel durum doğurur.catch yan tümcesinden sonraki kod bloğu ise özel durum işleyicisidir.Bu, throw ve catch ifadelerindeki türler uyumluysa, oluşturulan özel durumu yakalayan işleyicidir.catch bloklarında eşleşen türü yöneten kuralların listesi için bkz. Catch Blokları Nasıl Değerlendirilir (C++).catch deyimi, bir tür yerine üç nokta (...) belirtiyorsa, catch bloğu tüm özel durum türlerini işler./EHa seçeneğiyle derleme yaptığınızda, bunlar C yapısal özel durumlarını ve sistem veya uygulama tarafından oluşturulan bellek koruması, sıfıra bölme ve kayan nokta ihlalleri gibi zaman uyumsuz özel durumları içerebilir.catch blokları eşleşen bir tür bulmak için programda işlendiğinden, üç nokta işleyicisi ilişkili try bloğunun son işleyicisi olmalıdır.catch(...) öğesini dikkatli kullanın; yakalama bloğu yakalanan özel duruma ne yapılacağını bilmediği sürece bir programın devam etmesine izin vermeyin.Genellikle, bir catch(...) bloğu hataları günlüğe kaydetmek ve programın yürütülmesi durdurulmadan önce özel bir temizleme işlemi gerçekleştirmek için kullanılır.

İşleneni olmayan bir throw ifadesi işlenmekte olan bir özel durumu yeniden oluşturur.Bu, özgün özel durumun polimorfik türü bilgilerini koruduğundan, özel durum yeniden oluşturulduğunda bu biçim önerilir.Böyle bir ifade yalnızca bir catch işleyicisinde veya bir catch işleyicisi tarafından çağrılan bir işlevde kullanılmalıdır.Yeniden oluşturulmuş özel durum nesnesi bir 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.

Başvuru

C++ Özel Durum İşleme

C++ Anahtar Sözcükleri

İşlenilmeyen C++ İfadeleri

__uncaught_exception