Exception mit Durchfall?

18/11/2016 - 14:23 von Edzard Egberts | Report spam
Ich verwende die OpenCV und bei Out-Of-Memory wirft die eine
cv::Exception (die ist von std::exception abgeleitet), zur Sicherheit
möchte ich aber alles fangen. Das sieht so aus:

try { Update_Results(); }
catch (...) // alternativ "catch (cv::Exception& e)" geht auch nicht
{
Message_Error();
Clear_Mem();
}

Funktioniert nicht - im Debugfenster sehe ich zwar eine Ausgabe, dass
die OpenCV eine Exception geworfen hat, die wird aber nicht vollstàndig
abgefangen:

Unter Linux beendet das Programm kommentarlos, unter Windows erscheint
die Message_Error() aus dem catch-Zweig und ein Fenster "Microsoft
Visual C++ Runtime Library" "This application has requested the runtime
to terminate in an unusual way". Das erscheint mir widersprüchlich.

Wenn ich statt dessen so etwas mache (Test geht auch mit std::nothrow):

char* pMem= nullptr;
try { pMem= char[100*1024*1240]; }
catch (...)
{
Message_Error();
Clear_Mem();
pMem= nullptr;
}
delete[] pMem;
Update_Results();

Làuft die Sache durch und làsst sich auch mehrfach auslösen.

Lokal funktioniert die Exception also. Was habe ich da nicht verstanden,
warum wird die nicht aus der OpenCV durchgereicht und abgefangen,
sondern beendet die Laufzeitumgebung?
 

Lesen sie die antworten

#1 Stefan Reuther
20/11/2016 - 11:18 | Warnen spam
Am 18.11.2016 um 14:23 schrieb Edzard Egberts:
Funktioniert nicht - im Debugfenster sehe ich zwar eine Ausgabe, dass
die OpenCV eine Exception geworfen hat, die wird aber nicht vollstàndig
abgefangen:

Unter Linux beendet das Programm kommentarlos, unter Windows erscheint
die Message_Error() aus dem catch-Zweig und ein Fenster "Microsoft
Visual C++ Runtime Library" "This application has requested the runtime
to terminate in an unusual way". Das erscheint mir widersprüchlich.



Das klingt, als ob irgendwo mittendrin 'abort', wahrscheinlich ausgelöst
von 'terminate', aufgerufen wird. Dass das unter Linux kommentarlos
wegfliegt, könnte an restriktiv eingestellten ulimits liegen.

Hast du schon mal einen Debugger drangehàngt? Wenn der dich (unter
Linux) nicht direkt mit der Nase draufstößt ("Programm von SIGABRT
angehalten, hier ist der Backtrace"), setze einen Breakpoint auf
__cxa_throw, das ist die Library-Funktion fürs Exception-Werfen.

Blind raten würde ich, dass da irgendwo ein Destruktor rumhàngt, der
wieder eine Exception wirft.


Stefan

Ähnliche fragen