2017-01-12 33 views
6

Sadece bir istisna hiyerarşisi oluşturdum ve yakalama blokumun türetilmiş istisnanın mesajını göstermesini istiyorum. bunun gibi 5 istisnalar var: Hepsi de TGAException türetilenC++ İçinde İstisnalar Hariç Tut

class ImagetypeException : public TGAException { 
public: 
const char* what() const throw(); 
}; 


const char* ImagetypeException::what() const throw() { 
    return "Der Bildtyp ist nicht \"RGB unkomprimiert\"."; 
} 

, o std :: istisna türetilmiştir.

class TGAException : public std::exception { 
public: 
    virtual const char* what() const throw(); 
}; 

const char* TGAException::what() const throw() { 
    return "Beim Einlesen oder Verarbeiten der TGA-Datei ist ein unerwarteter Fehler aufgetreten!"; 
} 

Yani açıkçası benim kodunda bir noktada bu atmak istiyorum ve ihtiyacım yakalama blokların miktarını en aza indirmek için, iyi bir fikir olabileceğini düşündüm. Ben böyle yaparsanız

catch (TGAException e) { 
     cout << e.what() << endl; 
    } 

, basılacak mesajı, TGAException dan biridir, ama daha özel türetilmiş mesajlar göstermek istiyorum. Peki, bunu istediğim şekilde çalışmak için bunu yapmak için ne yapmam gerekiyor?

+4

"catch (TGAException & e)' de olduğu gibi referansla yakalayın. Değerle yakaladığınızda, istisna nesnesini değiştirmeyi planladığınızdan, yapılamamıza göre [slice it] (https://en.wikipedia.org/wiki/Object_slicing) –

+1

daha iyisi olursunuz. @IgorTandetnik bunu bir cevap vermelisiniz (ya da ben de rep çalamaya çalışmıyorum) –

+1

Yapıyorsunuz * Nesne Dilimleme *, referansla yakalanana kadar. –

cevap

9

böyle yakaladığımda:

catch (TGAException e) { 
    cout << e.what() << endl; 
} 

derleyici orijinal istisna bir kopyasını oluşturur ve e atar. TGAException kopya oluşturucusunu kullanır, böylece catch bloğu içinde görülen istisna bir ImagetypeException değildir, bir TGAException. Bu olguya nesne dilimleme denir.

Eğer bu şekilde yakalarsak:

catch (const TGAException & e) { 
    cout << e.what() << endl; 
} 

Kopyalama yok gereklidir ve bunu, ona bekliyoruz şekilde çalışacaktır.

Genel bir kılavuz olarak: Her zaman referanslarla istisnaları yakalayın ve hemen hemen her zaman const başvuru tarafından yakalayın.

+0

Teşekkürler! çok yararlı ve hızlı cevap :) ama ilk etapta bir noob soru -_- ' – Awesome36

+1

Nope. Güzel bir soru. Kaç tane C++ programcısının nesne dilimlemesine göre tetiklendiğine şaşıracaksınız (not: parametreler ve geri dönüş değerleri değerle geçirildiğinde, hatta hedef bir işaretçi veya referans olmadığında bile atamalar olduğunda, yöntem çağrılarında gerçekleşebilir.) –