Obserwuje i obserwuje ten wątek i nikt nie widzi w czym problem.
W końcu mnie to wkurzyło i oto program demonstrujący o co chodzi z tym thow;:
#include <iostream>
using namespace std;
class CleanStackLog
{
const char* text;
public:
CleanStackLog( const char* logText ):text( logText )
{
cout << "Creating: " << text << endl;
}
CleanStackLog( const CleanStackLog& source ):text( source.text )
{
cout << "Coping: " << text << endl;
}
~CleanStackLog()
{
cout << "Destroying: " << text << endl;
}
};
void ThrowTest()
{
CleanStackLog info( "Rethrowing" );
throw;
}
int main(void)
{
cout << "Start" << endl;
try
{
CleanStackLog trying1( "try 1");
try
{
CleanStackLog trying1( "try 2");
throw CleanStackLog( "Thrown object" );
}
catch ( int e )
{
cout << "Unreachable e = "<< e << endl;
}
catch ( CleanStackLog& e )
{
cout << "First throw and catch was successful" <<endl;
ThrowTest();
}
}
catch ( int e )
{
cout << "Unreachable e = "<< e << endl;
}
catch ( CleanStackLog& e )
{
cout << "Rethrow and catch was successful" <<endl;
}
try
{
CleanStackLog trying1( "try 3");
ThrowTest();
}
catch ( ... )
{
cout << "Empty catch" << endl;
}
cout << "Stop" << endl;
}
Na ekranie pojawia się:
Start
Creating: try 1
Creating: try 2
Creating: Thrown object
Destroying: try 2
First throw and catch was successful
Creating: Rethrowing
Destroying: Rethrowing
Destroying: try 1
Rethrow and catch was successful
Destroying: Thrown object
Creating: try 3
Creating: Rethrowing
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
Jeśli ktoś jeszcze nie rozumie o co chodzi to wyjaśniam. throw; oznacza rzuć ponownie wyjątek. Czyli to może się pojawić TYLKO wewnątrz bloku catch. Kompilator nie wykrywa tego ponieważ dopuszczalne jest ponowne rzucanie wyjątku z wnętrza metody, co doskonale widać z załączonego powyżej kodu i otrzymanego wyniku.
Po tym to już musi być END OF TOPIC.