Aracılığıyla paylaş


Catch Blokları Nasıl Değerlendirilir (C++)

Genel olarak std::exception'dan türetilen türler oluşturulması önerilse de, C++ her türden özel durumlar oluşturmanıza olanak tanır. C++ özel durumu, atılan özel durumla aynı türü belirten bir catch işleyici veya herhangi bir özel durum türünü yakalayabilen bir işleyici tarafından yakalanabilir.

Oluşturulan özel durumun türü temel sınıfı (veya sınıfları) da olan bir sınıfsa, özel durum türünün temel sınıflarını kabul eden işleyiciler ve özel durum türünün başvuruları tarafından yakalanabilir. Özel durum bir başvuru tarafından yakalandığında oluşturulan gerçek özel durum nesnesine bağlanır; aksi takdirde bir kopya (işlevin bağımsız değişkeniyle hemen hemen aynı) olur.

Bir özel durum oluştuğunda, aşağıdaki işleyici türleri catch tarafından yakalanabilir:

  • Herhangi bir türü kabul edebilen bir işleyici (üç nokta sözdizimini kullanarak).

  • Özel durum nesnesiyle aynı türü kabul eden bir işleyici; çünkü bu bir kopyadır const ve volatile değiştiriciler yoksayılır.

  • Özel durum nesnesiyle aynı türe yapılan başvuruyu kabul eden bir işleyici.

  • Özel durum nesnesiyle aynı türde veya volatile biçimine başvuru kabul eden bir const işleyici.

  • Özel durum nesnesiyle aynı türdeki bir temel sınıfı kabul eden bir işleyici; bir kopya const olduğundan ve volatile değiştiriciler yoksayılır. catch Bir temel sınıfın işleyicisi, türetilmiş sınıf için işleyiciden catch önce olmamalıdır.

  • Özel durum nesnesiyle aynı türden temel sınıf başvurusunu kabul eden bir işleyici.

  • Özel durum nesnesiyle aynı türdeki bir const temel sınıfa veya volatile biçimine başvuru kabul eden bir işleyici.

  • Oluşturulan bir işaretçi nesnesinin standart işaretçi dönüştürme kurallarıyla dönüştürülebileceği bir işaretçiyi kabul eden bir işleyici.

İşleyicilerin görünme sırası catch önemlidir, çünkü belirli try bir bloğun işleyicileri görünüm sırasına göre incelenir. Örneğin, temel sınıfa yönelik bir işleyicisi türetilmiş sınıfa yönelik bir işleyiciden önce yerleştirmek hatadır. Eşleşen catch bir işleyici bulunduktan sonra, izleyen işleyiciler incelenmez. Sonuç olarak, üç nokta catch işleyicisi bloğu için try son işleyici olmalıdır. Örnek:

// ...
try
{
    // ...
}
catch( ... )
{
    // Handle exception here.
}
// Error: the next two handlers are never examined.
catch( const char * str )
{
    cout << "Caught exception: " << str << endl;
}
catch( CExcptClass E )
{
    // Handle CExcptClass exception here.
}

Bu örnekte, incelenen tek işleyici üç nokta catch işleyicisidir.

Ayrıca bkz.

Özel durumlar ve hata işleme için modern C++ en iyi yöntemleri