try/catch: absturz nach rethrow exception
-
Hallo,
ich benötige dringend Hilfe im Bereich try/catch. Das Problem resultiert auf Grund einer geworfenen Exception innerhalb eines Catch-Blocks.
Hintergrund: Im try{} wird die Methode XY aufgerufen, welche wiederum mit try/catch abgesichert ist. Innerhalb dieser Methode XY sollen gefangene Fehler im Catch-Block nach oben weitergeleitet werden.
Pseudocode:
try { Methode_XY(); ... } catch(){...}
MethodeXY im Detail:
... try { ... } catch(CEr_TR_ENDE_VALUE error) { if(...) { ... } else { THROW_ERROR(CEr_TR_ENDE_VALUE, 0); } }
Das Problem ist nun, dass im else{} - beim Weiterleiten der Exception - folgende Fehlermeldung erscheint und das Programm abstürzt:
"Unhandled exception at 0x4006b2f8 in TLXXXX_Main.exe: Microsoft C++ exception: [rethrow] at memory location 0x00000000.."Folgende Varianten führen zum selben Fehler:
else { throw; }
else { throw CEr_TR_ENDE_VALUE(&error); }
Basis der Entwicklung: Windows Embedded CE 6.0
Habt ihr Ideen was die Ursache sein kann!? Danke...
-
Zeige mal detailiert den Code der die Methode aufruft. Evtl. stimmt der Typ im catch Block nicht.
-
Vielen Dank für die schnelle Reaktion
wie gewünscht der detailierte Aufruf der Funktion:
CError CEP_Control::_control_function(){ ... try{ while(1){ //------------------------------------------Vortitration----------------------- if(_methode.vor_tit_volume()>0){ try{ ... } catch(CEr_TR_ENDE_VALUE error){ ... } ... } }//if vortit //------------------------------------Beginn Regelung----------------------------- CEndpoint_Basic_Class::_get_mess_valueEX(); [b]_ep_regelung()[/b]; // besagter Methodenaufruf XY } } catch(CEr_TR_ENDE_VALUE error){ _ep_berechnen(); _formel_berechnen(); } catch(CEr_TR_EP_NOT_FOUND error){} catch(CEr_TR_EP_MESS_ABWEICHUNG error){_add_valuesEX(true);} catch(CEr_TR_ENDE_USER error){} //------------------------------------Ende Regelung------------------------------- ... }
Die Struktur der besagten Methode:
void CEP_Control::_ep_regelung(){ try{ ... } catch(CEr_TR_ENDE_VALUE error){ ... try{ ... } catch(CEr_TR_EP_ABKLING_TIMEOUT error){} catch(CEr_TR_EP_MESS_ABWEICHUNG error){_add_valuesEX(true);} } catch(CEr_TR_EP_NOT_FOUND){ if (_b_2ep){ ... } else{ THROW_ERROR(CEr_TR_ENDE_VALUE,0); // kein Absturz } } while(1){ try { ... }//try catch(CEr_TR_ENDE_VALUE error){ if (_b_2ep){ ... try{ ... } catch(CEr_TR_EP_NOT_FOUND){} } else{ [b]THROW_ERROR(CEr_TR_ENDE_VALUE,0);[/b] // Absturz } } catch(CEr_TR_EP_MESS_ABWEICHUNG error){_add_valuesEX(true);} catch(CEr_TR_EP_ABKLING_TIMEOUT error){} }//while }
Ich hoffe das es weiterhilft.
-
Hallo,...
ich habe die Ursache erkannt: Man kann wie es scheint aus verschachtelten Try/Catch Blöcken die Exception nicht an die höheren Catch'es weiterreichen. Den Quellcode habe ich wie folgt umgebaut:
void CEP_Control::_ep_regelung(){ ... while(1){ [b]int itmp = 0;[/b] try { [b]try { ... } catch(CEr_TR_EP_ABKLING_TIMEOUT error){ THROW_ERROR(CEr_TR_ENDE_VALUE,0); }[/b] }//try catch(CEr_TR_ENDE_VALUE error){ if (_b_2ep){ ... try{ ... } catch(CEr_TR_EP_NOT_FOUND){} } else{ [b]//THROW_ERROR(CEr_TR_ENDE_VALUE,0); // ehemaliger Absturz[/b] [b]iTmp = 1;[/b] } } catch(CEr_TR_EP_MESS_ABWEICHUNG error){_add_valuesEX(true);} catch(CEr_TR_EP_ABKLING_TIMEOUT error){} [b] if(iTmp == 1) THROW_ERROR(CEr_TR_ENDE_VALUE,0);[/b] }//while }
Aber wieso funktioniert der Umbau? Wieso kann man die Exceptions nicht durchreichen?
-
Vermutlich ein Compiler-Bug, sollte nämlich schon gehen.
Bzw. was ist denn
CEr_TR_ENDE_VALUE
für ein Typ?
enum?
Eigene Klasse?
Zeig mal die Definition her...
-
Hallo,
Defintion:
class CEr_TR_ENDE_VALUE: public CError { public: CEr_TR_ENDE_VALUE():CError(){} CEr_TR_ENDE_VALUE(const CError *copy_method):CError(*copy_method){} CEr_TR_ENDE_VALUE(DWORD z_data,const char *file, const unsigned long line):CError(9176,z_data,file,line,"Titrationsreglung-Ende Value") { } ~CEr_TR_ENDE_VALUE(){} };
-
rofl
ok
-
Frage: Führt Dein Lachen auf die Tatsache zurück, dass Du davon ausgehst, dass CError nicht vom Typ "exception" ist. Ich muss Dich leider enttäuschen, denn:
class ERROR_API CError : public exception
Ich habe an dieser Stelle mit einer sinnvollen / hilfreichen Antwort gerechnet und nicht mit solch einer unnötigen Aussage!
Sollte niemand weiter helfen können, kann dieser Zweig gerne geschlossen werden.
Gruß