Moin,
Machen mehrere Instanzen von Exceptionklassen einen Sinn? Denn das hieße ja, daß man spätestens beim Erstellen der 2. Exceptioninstanz die 1. Exception ignoriert hat!
das hat seinen Sinn, sobald du mehrere Stellen hast, an denen Exceptions geworfen werden können, vielleicht sogar parallel.
Genau diese Stellen setzt man in einen try{}Block. Und wenn man 2 dieser möglichen Stellen in einen try{}Block setzt, sollte man daran denken, daß eine 2. EX gar nicht fallen kann wenn die 1. EX gefallen ist. catch() kriegt also entweder die eine oder die andere Ursache übergeben.
Wenn du wissen möchtest, welchen Sinn mehrere Exception-Objekte in einem try-catch-Block haben, dann frage bitte auch dementsprechend. Meine Antwort hat sich auf die oben zitierte allgemeine Frage nach dem Sinn mehrerer Exception-Objekte in einem Programm (Thread?) bezogen.
Natürlich kann von den verschiedenen möglichen Exceptions immer nur eine fallen, aber es kann es eine der verschiedenen sein, in dem Taschenrechnerbeispiel neben der Division durch Null z.B. auch eine Unter- oder Überschreitung des Wertebereichs oder in dem Beispiel mit der Parser-Exception könnte es auch eine Exception der darunterliegenden IO-API sein, lies: Das Parsen kann fehlschlagen, wenn nicht aus der Datei gelesen oder der Dateiinhalt fehlerhaft ist.
In Form
1. eines Literals 2. oder einer Referenz 3. oder einer Klasse
Und da wären wir wieder bei meiner Frage: Wozu soll 3. Gut sein!?
Was genau meinst du mit Klasse? In meinen Beispielen wird keine Klasse geworfen, sondern Objekte von Klassen.
Abgesehen davon daß man mehrere EX Verdächtigte besser nicht in einen try{}Block setzt.
Also in dem Parserbeispiel lieber
FileOfSpecificType f = NULL;
try {
f = new FileOfSpecificType(filePathAndName);
}
catch (IOError &ioe) {
std::cerr << "Could not open " << filePathAndName << " for reading: "
<< ioe.what() << '\n';
}
catch (SecurityException &se) {
std::cerr << "Permission denied: " << filePathAndName << '\n';
}
catch (MemoryError &me) {
std::cerr << "Could not allocate enough memory for parsing " << filePathAndName
<< ": " << me.what() << '\n';
}
if (!f) return;
try {
objekts = f->parse();
}
catch (IOError &ioe) {
std::cerr << "Could not parse " << filePathAndName << ": "
<< ioe.what() << '\n';
}
catch (MemoryError &me) {
std::cerr << "Could not allocate enough memory for parsing " << filePathAndName
<< ": " << me.what() << '\n';
}
catch (ParserException &pe) {
std::cerr << "Unexpected token " << pe.token() << " in " << pe.file()
<< " at line " << pe.line() << ", position " << pe.pos() << '\n';
}
try {
f->close();
delete f;
}
catch (Eception &e) {
std::cerr << "I'm already finished ;).\n";
}
statt
try {
FileOfSpecificType f(filePathAndName);
objects = f.parse();
f.close();
}
catch (IOError &ioe) {
std::cerr << "Could not parse " << filePathAndName << ": "
<< ioe.what() << '\n';
}
catch (SecurityException &se) {
std::cerr << "Permission denied: " << filePathAndName << '\n';
}
catch (MemoryError &me) {
std::cerr << "Could not allocate enough memory for parsing " << filePathAndName
<< ": " << me.what() << '\n';
}
catch (ParserException &pe) {
std::cerr << "Unexpected token " << pe.token() << " in " << pe.file()
<< " at line " << pe.line() << ", position " << pe.pos() << '\n';
}
Also ich sehe da nicht den Vorteil der oberen Lösung. Welcher soll es sein?
Viele Grüße
Robert