Ich kann nicht scheinen, meinen Kopf herum zu bekommen, warum Leute sagen, dass C++ - Ausnahmen besser sind. Zum Beispiel habe ich eine Anwendung, die Funktionsobjekte von gemeinsam genutzten Objekten lädt, die in der Anwendung verwendet werden sollen. Was passiert, ist so etwas wie:Wie ändere ich meine Fehlerbehandlungsmethode
bool LoadFunctions()
{
//Get Function factory.
FunctionFactory& oFactory = GetFunctionFactory();
//Create functions from the factory and use.
}
FunctionFactory& GetFunctionFactory()
{
//Get shared object handle.
void* pHandle = dlopen("someso.so");
//Get function ptr for Factory getter.
typedef FunctionFactory* (*tpfFacGet)();
tpfFacGet pF = static_cast<tpfFacGet>(dlsym(pHandle, "GetFactory"));
//Call function and return object.
return *((*pF)());
}
Jetzt ist es einfach zu sehen, dass viele Dinge schief gehen können. Wenn ich es so machen würde, wie ich es immer tue, würde ich Zeiger anstelle von Referenzen zurückgeben, und ich würde prüfen, ob sie NULL
sind und eine Fehlermeldung ausgeben und herauskommen, wenn sie nicht wären. Auf diese Weise weiß ich, wo die Dinge schief gelaufen sind, und ich kann sogar versuchen, mich davon zu erholen (d. H. Wenn ich die Fabrik erfolgreich geladen habe und nur eine einzige Funktion nicht laden kann, fahre ich möglicherweise fort). Was ich nicht verstehe, ist, wie man Ausnahmen in einem solchen Szenario verwendet und wie man das Programm wiederherstellt, anstatt eine Fehlermeldung und ein qutting zu drucken. Kann mir jemand sagen, wie ich das auf C++ so machen soll?
"// Ausnahmebedingungsnachricht, elegant beenden" - Dies ist genau die Art von Sache, die ich nicht verstehe. Was, wenn ich nicht aufhören will? Was mache ich dann? – nakiya
Wenn Sie nicht aufhören möchten, schreiben Sie einfach, was Sie stattdessen im catch-Block tun möchten. – Simone
Es ist so einfach, und dann wissen Sie, dass Ihre GetFunctionFactory-Funktionen immer ein konsistentes Ergebnis zurückgibt, so dass es nicht jedes Mal überprüft werden muss, wenn es verwendet wird. – daramarak