Frage

Ich habe eine Klasse, die TCP-Socket-Kommunikation mit einem Server kapselt. Für jede Befehlsnachricht an den Server gesendet, sendet der Server eine Antwortnachricht zurück, die unweigerlich einen Antwortcode enthält (OK, Fail). Mit meiner Klasse kann jeder Befehl entweder synchron oder Asynchron ausgeführt werden.

Es gibt grundsätzlich zwei Arten von Ausnahmen, die stattfinden können: Ein „Fehler“, die durch eine Trenn oder ein anderes nicht behebbarer Fehler und eine unerwartete Ausnahme wie „Sendepuffer ist voll“ verursacht wird. Im Fall eines Fehlers kann kein Befehl fortsetzen oder wieder oder alles versuchen, bis die Verbindung wieder hergestellt ist. Im Fall einer fehler Reaktion oder sogar eine Ausnahme kann der Befehl erneut versucht werden ...

So, jetzt meine Sync-Befehl Methoden geben eine Enumeration, die die folgenden Werte haben kann: OK, Fehler, Fehler. Wenn eine Ausnahme auftritt, wird er einfach an den aufrufenden Thread angehoben (in einem Sync-Befehl). Für Asynchron-Befehle kann das Ergebnis Eigenschaft Enum-Wert einen zusätzlichen Wert enthalten: OK, Fehler, Fehler oder eine Ausnahme und der Rückruf das tatsächliche Ausnahmeobjekt über das Exception-Eigenschaft Befehl Objekt zugreifen

.

Was denken Sie über diese Strategie? Ich bin nicht Ausnahmen überhaupt für die Synchronisation Befehle zu erhöhen versucht, und melden Sie sich nur die Ausnahme intern und gibt den vierten ENUM-Wert statt, weil das alles, was ich wirklich sowieso mit Ausnahmen in jedem gegebenen Fall tun werde ... Oder soll ich nicht verwenden Ergebniscodes an alle und nur Ausnahmen in allen Fällen erhöhen, auch Fehler?

Danke.

War es hilfreich?

Lösung

Ich denke, Ihre Strategie ist grundsätzlich solide ist.

Beachten Sie, dass der Zweck der Ausnahmen mit außergewöhnlichen Bedingungen zu behandeln ist. Je näher an die Quelle des Problems, desto besser.

In Ihrem Fall scheint es, dass Ihre Strategie ist es so etwas wie „Es hat nicht gerade arbeiten. Lassen Sie uns versuchen Sie es erneut“. Ich sehe keinen Grund, um wirklich Ausnahmen zu erhöhen.

Wenn mit einer geschlossenen Dose handelt, war etwas, das eine ganz andere Strömung in Ihrem Code erforderlich ist, dann vielleicht wären Ausnahmen sinnvoll. Aus Ihrer Beschreibung, das ist nicht wirklich der Fall ist.

Meine Philosophie auf Ausnahmen ist, dass sie für außergewöhnliche Bedingungen sein sollte, die Sie nicht wirklich umgehen können. Eine geschlossene Buchse? Hmm ... wie oft ist das Internet nach unten gehen in meinem Haus ...

Andere Tipps

Meine Präferenz ist, dass Sie eine Ausnahme zu jeder Zeit werfen Sie Ihre Methode nicht erfolgreich abgeschlossen seine Mission. Also, wenn ich, der Anrufer, rufen yourObject.UploadFile () wird nehme ich die Datei wurde erfolgreich bei der Aufruf zurückgegeben wird hochgeladen. Wenn es aus irgendeinem Grund ausfällt, erwarte ich, dass Ihr Objekt wird eine Ausnahme werfen. Wenn Sie zwischen den Befehlen unterscheiden mögen, kann ich wiederholen und Befehle, die ich nicht wiederholen, stellt diese Informationen in der Ausnahme, und ich kann entscheiden, wie entsprechend reagieren zu können.

Wenn yourObject.BeginAsyncUploadFile () aufgerufen wird, würde ich das gleiche Verhalten außer erwarten, dass ich brauchen würde, um auf dem IAsyncResult oder gleichwertiges Objekt zu warten, um herauszufinden, ob die Datei-Upload erfolgreich war oder nicht, und überprüfe dann eine Exception / Error Eigenschaft, wenn es nicht.

Ergebniscodes und Ausnahmen können beide gut funktionieren. Es ist eine Frage des persönlichen Geschmacks (und den Geschmack der anderen in Ihrem Team). Ausnahmen haben einige Vorteile, vor allem bei komplexeren Einstellungen, aber in Ihrer Einstellung klingt es einfach genug, dass Return-Codes sollten in Ordnung arbeiten.

Einige Leute werden am Mund schäumen und bestehen auf Ausnahmen, aber auf mein Projekt Menschen wie die Einfachheit der Rückkehrcodes, so dass sie die bessere Wahl machen insgesamt.

Dies ist eine ziemlich interessante Frage. Als solches ist es wahrscheinlich keine ‚100% richtig‘ Antwort, und vor allem hängt es davon ab, wie denken Sie, der Code Ihrer Funktion strukturiert werden soll.

So wie ich es sehe, ist Sie Ausnahmen nur verwenden, wenn Sie den Code Aufruf Ihre Funktion mit einer Art und Weise zur Verfügung stellen mögen anmutig von einer "katastrophalen Situation zu entkommen. Also, ich normalerweise in meinem Code eine Ausnahme werfen, wenn etwas wirklich, wirklich schrecklich passiert, und der Anrufer muss wissen.

Nun, wenn das, was Sie haben eine normale, und erwarten, Situation sollten Sie wahrscheinlich einen Fehlerwert zurück. Auf diese Weise der Code weiß es zu ‚try harder‘ braucht, aber es wird nicht beeinträchtigt werden, was passiert ist.

In Ihrem Fall zum Beispiel, könnten Sie den Timeouts als etwas zu erwarten, behandeln und damit einen Fehlercode zurück, und schwerere Probleme (wie ein Vollsendepuffer), in dem der anrufende Code muss einige zusätzliche Aktionen auszuführen zurück zu gehen zu ‚normalen‘ als Ausnahme.

Aber dann, Schönheit liegt im Auge des Betrachters, und einige Leute werden Sie nur Ausnahmen verwenden erzählen, andere (meist C-Programmierer) nur Rückgabecodes zu verwenden. Denken Sie daran, sollten Ausnahmen immer außergewöhnlich sein. :)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top