SORU
24 EYLÜL 2008, ÇARŞAMBA


atma bir istisna dışında yıkıcı

Çoğu insan demekaslabir yıkıcı - tanımsız davranış oluşur yapmanın bir özel durum. Stroustrup noktası yapar"açıkça her element için yıkıcı çağırır yıkıcı vektör. Bunu ima eden bir elementin yıkıcı atar, vektör imha başarısız... gerçekten iyi bir şekilde korumaya karşı özel durum oluşturuldu, gelen yıkıcı, kütüphane yapar garanti Bir elementin yıkıcı atar" (Ek E3.2).

This article atma yıkıcılar daha fazla veya daha az iyi olan aksini söylemek gibi görünüyor.

Benim soru şu olacak - Eğer tanımsız davranışlara yıkıcı sonuçlarından atma, nasıl bir yıkıcı sırasında oluşan hataları işlemek musunuz?

Eğer bir hata temizleme işlemi sırasında ortaya çıkarsa, sadece onu görmezden mi gelirsiniz? Eğer potansiyel yığın ama doğru yıkıcı idare edilebilir bir hata ise, bu anlamda yıkıcı bir özel durum değil mi?

Belli ki bu tür hataları nadirdir, ama mümkündür.

CEVAP
24 EYLÜL 2008, ÇARŞAMBA


Bir yıkıcı bir istisna atma tehlikelidir.
Eğer başka bir durum zaten yayılıyor ise, uygulama sonlandırılacak.

#include <iostream>

class Bad
{
    public:
        ~Bad()
        {
            throw 1;
        }
};

int main()
{
    try
    {
        Bad   bad;
    }
    catch(...)
    {
        std::cout << "Print This" << std::endl;
    }

    try
    {
        Bad   bad;
        throw 2;
    }
    catch(...)
    {
        std::cout << "Never print this " << std::endl;
    }
}

Bu temelde aşağı kaynar:

Tehlikeli bir şey (yani istisna olabilir) genel yöntemler (değil doğrudan) yapılmalıdır. Sınıfınızın kullanıcı daha sonra potansiyel ortak yöntemler kullanarak ve olası istisnalar alıcı bu durumlarla başa çıkabilecek.

Yıkıcı sonra bu yöntemler kullanıcı açıkça bunu yaptığı () çağırarak nesne halleder, ama özel durumlar ve (sorunu çözmek için çalışıyor sonra) yakaladı bırakılan at.

Etkileşen kullanıcı üzerine sorumluluk geçirir. Eğer kullanıcı özel durumlar için doğru bir konumda ise el ile ilgili arama işlevleri ve herhangi bir hata işler. Eğer nesnenin kullanıcı endişeli nesne yok olacak gibi değil yıkıcı bir işin kalmadı.

Bir örnek:

::std fstream

Close() yöntem olarak bir istisna olabilir. Dosya açıldı ama herhangi bir istisna yıkıcı dışında yaymak değil emin yapar. yok yakın çağrı()

Eğer bir file nesnesinin kullanıcı sorunları dosyayı kapatmak için ilişkili özel işlem yapmak istiyorsa el ile kapatmak isterler ve bu yüzden herhangi bir özel durumları işlemek. Diğer taraftan eğer yıkıcı durumun üstesinden gelmek için sol olacak, hiç umurlarında değil.

Scott Myers adlı kitabında bu konu hakkında mükemmel bir makale var "Etkili C"

Düzenleme:

Görünüşe göre aynı zamanda "Daha Etkili" . C ^br> Item 11: Prevent exceptions from leaving destructors

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Klemens Torggler

    Klemens Torg

    11 Mart 2008
  • Major FX

    Major FX

    6 HAZİRAN 2012
  • TecnoTutosPC

    TecnoTutosPC

    19 Kasım 2012