Ich habe einige Codes, der wie folgt aussieht:brauchen ein robustes Fehlersystem für eine Win32-GUI-Anwendung
void MyClass::OnButtonClick()
{
int retVal = SomeDialog.DoModal();
if(retVal == MYCLASS_ERROR)
{
MessageBox("Error"...blah ...blah);
}
else if(retVal == IDOK) // IDOK is returned on clicking the 'OK' button
{
MessageBox("All is well"...blah ...blah);
}
}
SomeDialog
nur zeigt einen Fortschrittsbalken. Bei jedem Fehler wird der Fortschrittsbalken automatisch durch den Aufruf vonEndDialog(MYCLASS_ERROR)
geschlossen. Nur bei erfolgreichem Abschluss kann der Benutzer dort auf "OK" klicken.MYCLASS_ERROR
ist ein Wert in einemenum
, der alle Arten von Rückgabetypen und Status enthält.
Ich fand, dass beim Klicken auf OK in SomeDialog
die Fehlermeldung immer noch angezeigt wird! Ich grub ein wenig tiefer und fand, dass MYCLASS_ERROR
= IDOK
= 1.
Also meine Frage ist, wie soll ich all diese Rückkehr Zustände so definieren, dass sie nicht mit anderen Implementierung des Status kollidiert? Bedeutung, meine Funktionen sollten Werte zurückgeben, die nicht von anderen anderen Funktion zurückgegeben werden (oder so wenige andere Funktionen wie möglich).
Ich dachte an mein Design so zu ändern, dass alle Funktionen nur TRUE oder FALSE zurückgaben. Dies wäre jedoch nicht in allen Fällen möglich. Ich habe auch einiges nach Antworten gesucht und bisher noch keine gefunden.
Danke fürs schauen!
Hmm das klingt am besten. Aber was ist mit anderen Funktionen? Zum Beispiel Worker-Threads, Hilfsfunktionen usw. Welche Art von Werten sollten sie zurückgeben? Danke für deine Antwort! –
@Anish: Hmm, das ist ein bisschen härter. Sie könnten wahrscheinlich damit fertig werden, einen Ihrer aufgezählten Fehlercodes direkt zurückzugeben, da es für ihre Rückgabewerte noch kein Standard-Idiom gibt. Aber die Fehlerbehandlung über Return-Codes ist ziemlich schwierig zu bekommen, und dies ist nur einer der Gründe. Ehrlich gesagt, ich frage mich, ob Sie nicht nur Ausnahmen verwenden sollten. Das ist schließlich C++, nicht C. –
Ich würde Ausnahmen verwenden, aber ich bin tatsächlich Schnittstelle mit vielen DLLs in C codiert. Also dachte ich, ich würde versuchen, die Dinge einheitlich zu machen. Aber leider scheint es nicht so gut zu funktionieren. –