C++

2017-01-19 39 views
10

'da özel özel durumlar oluşturma C++ öğreniyorum ve kendi özel durumumu oluşturmaya ve bunları Linux'a atmaya çalıştığımda yaşıyorum.C++

Uygulamamı sınamak için küçük bir test projesi oluşturdum ve aşağıda istisna sınıf başlık dosyam var.

class TestClass : public std::runtime_error 
{ 
public: 
    TestClass(char const* const message) throw(); 
    virtual char const* what() const throw(); 
}; 

istisna sınıf için kaynak dosya benim ana uygulamasında

using namespace std; 

TestClass::TestClass(char const* const message) throw() 
    : std::runtime_error(message) 
{ 

} 

char const * TestClass::what() const throw() 
{ 
    return exception::what(); 
} 

, benim durum atar ve aşağıdaki gibi bir try/catch bunu yakalar bir işlev arıyorum geçerli:

void runAFunctionAndthrow(); 

/* 
* 
*/ 
int main(int argc, char** argv) { 
    try 
    { 
     cout << "About to call function" << endl; 
     runAFunctionAndthrow(); 
    } 
    catch (TestClass ex) 
    { 
     cout << "Exception Caught: " << ex.what() << endl; 
    } 

    return 0; 
} 

void runAFunctionAndthrow() 
{ 
    cout << "going to run now. oh dear I need to throw an exception" << endl; 

    stringstream logstream; 
    logstream << "This is my exception error. :("; 
    throw TestClass(logstream.str().c_str()); 
} 

Ben şu çıktıyı almak için bekliyorum çalıştırın:

About to call function

Going to run now. oh dear I need to throw an exception

Exception Caught: This is my exception error. :(

yerine ne alıyorum

About to call function

going to run now. oh dear I need to throw an exception

Exception Caught: std::exception

Bildirim yerine benim gerçek istisna mesajının std :: istisna diyor son çizgidir "Bu benim özel durum hatadır".

Bu neden, Windows üzerinde tamam çalışıyor, ancak Linux'ta bunu yapıyor.

Yaptığımdan farklı yayınlarda gördüğüm şey doğruydu, bu yüzden neyi kaçırdım?

+0

"what()" ifadesinde, muhtemelen runtime_error :: what(); --- ifadesini yeniden göndermeyi reddedeceğiniz anlamına gelir (burada temel sınıf davranışı sizin için zaten iyidir). –

cevap

17

Sizin what() döner:

return exception::what(); 

std::exception::what() dönüş değeri specified as follows geçerli:

bu kadar

Pointer to a null-terminated string with explanatory information.

. Daha fazla bir şey yok, başka bir şey değil. Gösterdiğiniz metin kesinlikle "açıklayıcı bilgi" olarak nitelendirilir. Ve bu, what() dönüş değeri için tek gerekliliktir (burada alman olmayan bir tanesi hariç).

Başka bir deyişle, C++, what() ile aldığınız öğelerin tam içeriğini garanti etmez. Gördüğünüz gibi what() görüyorsunuz, what() olsun.

Özel durumunuzun kendisini tanımlamasını istiyorsanız, bir şekilde, what() ürününüzün bir parçası olarak bunu uygulamanız size bağlıdır.

+1

'TestClass' std :: runtime_error öğesinin devraldığını göz önünde bulundurarak, yalnızca reimplementing'den kaçınabilirsiniz ne() '-' std :: runtime_error :: what() 'zaten yapıcısına iletilen iletiyi döndürür. –

+0

@MatteoItalia Bunu fark ettim ve açıklamanızdan önce yorumunuzu denedim ve şimdi beklediğim şeyi yapıyor. Yardımınız için teşekkürler. – Boardy

0

afaik'e izin verilmeyen std :: exception'a özel bir hata iletisi belirtmenin bir yoluna ihtiyacınız vardır. Olası bir çözüm için bkz. this.

8

Ne() yönteminin kendi uygulamasını ihtiyaç veya yorumlar

yazıldığı gibi std::runtime_error::what() kullanmak ki:

class TestClass : public std::runtime_error 
{ 
    std::string what_message; 
public: 
    const char* what() override 
    { 
     return what_message.c_str(); 
    } 
}; 

Ayrıca daha iyi ve onlar hakkında salt okunur sonra noexcept yerine throw() kullanın - link.

Ve try-catch içinde

:
catch (const TestClass& myException) 

yerine catch(TestClass myException)

- aksi takdirde potansiyel bir istisna atmada neden olabilir örtük bir kopyasını yapmak. Ayrıca polimorfizmi bozar: Eğer catch pure virtual interface uygulama örneğine başvurmak isterseniz, bir referans kullanmanız gerekir.

+0

Ah teşekkürler, teşekkürler, ekstra bilgi için teşekkürler. – Boardy