Erster Schritt beim Exception Handling
-
Hallo !
Ich habe in einer C++-Dll (Win32) eine Funktion zum Suchen von SubStrings in Strings mit strstr eingebaut. Nun, wenn jetzt aber einer der Strings keinen Wert enthält, leer ist, stürzt die App ab mit der Windows Fehlermeldung
Der Vorgang "read" konnte nich ausgeführt werden wobei eine Speicheradresse 0x000000 ist.Sicher könnte man jetzt bevor man strstr aufruft ersteinmal den String testen aber ich wollte mich einmal mit Fehlerbehandlung in VC++ vetraut machen. Wie ist es möglich diesen Fehler abzufangen und somit einen Programmabsturz zu verhindern, OHNE (erstmal) die Strings vorher zu prüfen ?
-
try/catch
MFC bietet die Klasse CString. Warum verwendest du dann strstr()?
-
Unix-Tom schrieb:
try/catch
So viel wusste ich auch schon schon. Es ging aber um die Syntax.
Habe ich die jetzt "herausgefunden". Jetzt gibt es allerdings ein neues Problem. Die Funktion sieht folgendermaßen aus:long __stdcall FindStr (LPCSTR lpText, LPCSTR lpWord) { char *pDest; try { pDest = strstr(lpText, lpWord); } catch (...) { return -1; } return (pDest - lpText + 1); }Das funktioniert auch wunderbar in der DEBUG Version. Die App stürzt nicht mehr ab.
Es kommt allerdings in der RELEASE Version erneut zum Absturz. Hat jemand eine Idee woran das leigen könnte ?P.S.: Ich wünschen allen eine frohes, neues Jahr ! :xmas2:
-
Das liegt an der fehlenden Initialisierung von pDest. Außerdem halte ich try/ catch an dieser Stelle für etwas unglücklich. Wenn hier eine Exception fliegt, dann eine vom System generierte. Du kannst diese Exception mit dem VC zwar fangen, handelst Dir aber weitere Probleme ein, wenn andere Objecte ins Spiel kommen. Deren Destruktoren werden dann nicht aufgerufen!
long __stdcall FindStr (LPCSTR lpText, LPCSTR lpWord) { char *pDest = NULL; __try { pDest = strstr(lpText, lpWord); } __except(EXCEPTION_EXECUTE_HANDLER) { return -1; } return((pDest) ? (pDest - lpText + 1) : -1); }/Edit: Natürlich liegt es nicht an der fehlenden Initialisierung, sondern an der fehlenden Prüfung des Rückgabewertes von strstr.
-
Ich habe gerade in meiner MSDN für __try geschaut. Ist ja recht komfortabel.
Aus dem Text ging allerdings nicht hervor das ich mir, wenn ich den von dir verbesserte Code, (-King-), Probleme einhandel.Heißt für mich jetzt, ich kann das so übernehmen, nicht wahr ?
Aller herzlichsten Dank auch.

-
Michael__W. schrieb:
Heißt für mich jetzt, ich kann das so übernehmen, nicht wahr ?
Ich hoffe doch, ja.
