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...


  • Mod

    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ß


Anmelden zum Antworten