2016-06-11 11 views
0

Ich habe einen Server, der Anforderungen empfängt, die ich analysieren muss, um die Parameter für den Anforderungshandler zu erhalten. Außerdem können sowohl das Parsing als auch der Anforderungshandler in irgendeiner Weise fehlschlagen (z. B. fehlt für den Parser ein Parameter; für den Anforderungshandler: ein Fehler in einer Datenbank), daher der "Status" im nachfolgenden Code. Der Request-Handler gibt natürlich eine Art von Antwort, die ich dann an den Client zurücksenden muss.Rückgabe mehrerer Werte und Status/Fehler von einer Funktion

So Ärger, den ich habe, welche der folgenden Optionen entscheiden, die ich in meinem "main" verwenden sollte, weil ich den Parser vom Handler getrennt halten will:

1)

parser.parse(request,&param1, &param2, &status) 

handler.handle(param1, param2, &response, &status) 

2)

status = parser.parse(request, &param1, &param2) 

status = handler.handle(param1, param2, &response) 

3)

Params params = parser.parse(request, &status) 

handler.handle(params, &response, &status) 

4)

status = parser.parse(request, &params) 

status = handler.handle(params, &response) 

5)

parser.parse(request, &params, &status) 

response = handler.handle(params, &status) 

6) usw., eine andere Kombination

(Param würde eine Art von Behälter für die verschiedenen Parameter, also für jede Art von Bitte ich hätte einen anderen "Params" -Typ. Auch die "&" könnte Zeiger oder Verweis bedeuten, ich benutze C++, aber es ist nicht relevant für die Frage)

Welche ist die einfachste, klarere, beste, ..., was auch immer?

*** Es gibt viele ähnliche Fragen, aber keiner umfassen den „Status“ Teil, so kann ich meine Meinung nicht

Antwort

0

Das ist nicht wirklich eine sprachunabhängig, da sie abhängig von Sprachfunktionen noch machen . Zum Beispiel in Java würde ich das wie tun:

try { 
    Params params = parser.parse(request); // parser.parse will throw ParseException if something wrong 
    Response response = handler.handle(params); // handler.handle will throw HandleException if something wrong 
    // send response to the client (status 200) 
} catch (ParseException e) { 
    // Send parse error to the client (for example: status 400 with e.getMessage() as message) 
} catch (HandleException e) { 
    // Send handle error to the client (for example: status 500 with e.getMessage() as message) 
} 

So ist die status ist nur eine Ausnahme, wenn es schlecht Status und keine Ausnahme ist, wenn es einen guten Zustand ist. Dies kann benutzerdefinierte Ausnahme mit status Feld für weitere Details sein.

Wenn die Programmiersprache die Ausnahmen nicht verwenden kann, können Sie beispielsweise den Wert für die Übergabe (&status) verwenden. Übergeben Sie das Ergebnis jedoch nicht und geben Sie den Status zurück. Gib das Ergebnis zurück. Das Ergebnis von parse ist params params, nicht der Status.

+1

Die Sache ist, ein Fehler ist nicht unbedingt eine Ausnahme. Zum Beispiel, wenn ein Benutzer sich mit einem falschen Passwort anmelden möchte, würde ich nicht sagen, dass dies eine "Ausnahme" ist. Hier wäre die Antwort ein Token, und es scheint nicht in Ordnung, ein Null-Token zurückzugeben, wenn das Passwort falsch ist. – Chrischpo

+1

Wenn ein Benutzer versucht, sich mit einem falschen Kennwort anzumelden, handelt es sich definitiv um eine Ausnahme, die in den HTTP-Status 401/403 aufgelöst werden sollte. Und Passwort-Checking-Funktion wird nicht 'null' zurückgeben. Es wird eine Ausnahme ausgelöst (nichts zurückgegeben). Weißt du, wie Ausnahmen funktionieren? Wenn die Funktion eine Ausnahme auslöst, wird 'null' nicht zurückgegeben. Es gibt nichts zurück und der Code-Ausführungsfluss springt zum "Fang" -Block. – djxak

+1

Ja, ich weiß, wie Ausnahmen funktionieren. Ich glaube einfach nicht, dass ein falsches Passwort eine Ausnahme ist, da es nicht außergewöhnlich ist, ist es sehr üblich, dass ein Benutzer ein falsches Passwort eingibt.Was ich damit meinte, war, dass es in deinem Code keine Möglichkeit gibt zu sagen, ob etwas schiefgelaufen ist, aber keine Ausnahme ausgelöst hat. – Chrischpo