Hey Leute!
Im folgenden Programm wird im main() im zweiten try bei der Erstellung von Noisy n4 eine Exception vom Typ char geworfen, die jedoch in der Funktionsdefinition (Konstruktor von Noisy) nicht erwähnt wird. Wenn dann unexpected_rethrow() aufgerufen wird sollte die Funktion eigentlich die Exception weiterwerfen. Es kommt jedoch die Programmausgabe, dass eine Exception nicht aufgefangen wurde (The programm terminated in an unusual way....). Ich habe auch schon die ganze main() in einen try-Block gehüllt, das Ergebnis blieb jedoch das selbe. Eigentlich sollte die Exception im main() nach dem 2. try aufgefangen werden.
Lg
Im folgenden Programm wird im main() im zweiten try bei der Erstellung von Noisy n4 eine Exception vom Typ char geworfen, die jedoch in der Funktionsdefinition (Konstruktor von Noisy) nicht erwähnt wird. Wenn dann unexpected_rethrow() aufgerufen wird sollte die Funktion eigentlich die Exception weiterwerfen. Es kommt jedoch die Programmausgabe, dass eine Exception nicht aufgefangen wurde (The programm terminated in an unusual way....). Ich habe auch schon die ganze main() in einen try-Block gehüllt, das Ergebnis blieb jedoch das selbe. Eigentlich sollte die Exception im main() nach dem 2. try aufgefangen werden.
C++:
#include <fstream>
#include <exception>
#include <cstring>
#include <cstdlib>
using namespace std;
ofstream out ("test.txt");
class Noisy
{
static int i;
int objnum;
enum {sz = 40};
char name[sz];
public:
Noisy (const char *nm = "array elem") throw (int)
{
objnum = i++;
memset (name, 0, sz);
strncpy (name, nm, sz-1);
out << "Constructing Noisy " << objnum << "name [" << name << "]" << endl;
if (objnum == 5)
{
throw int (5);
}
if (*nm == 'z')
{
throw char ('z');
}
}
~Noisy()
{
out << "destructing Noisy " << objnum << " name [" << name << "]" << endl;
}
void* operator new[] (size_t sz)
{
out << "Noisy::new[]" << endl;
return ::new char[sz];
}
void operator delete[] (void *p)
{
out << "Noisy::delete[]" << endl;
::delete []p;
}
};
int Noisy::i = 0;
void unexpected_rethrow()
{
out << "inside unexpected rethrow()" << endl;
throw;
}
int main()
{
set_unexpected (unexpected_rethrow);
try
{
Noisy n1 ("before array");
Noisy *array = new Noisy[7];
Noisy n2 ("after array");
}
catch (int i)
{
out << "caught " << i << endl;
}
out << "testing unexpected: " << endl;
try
{
Noisy n3 ("before unexpected");
Noisy n4 ("z");
Noisy n5 ("after unexpected");
}
catch (char c)
{
out << "caught " << c << endl;
}
}
Lg