2016-06-11 20 views
0

リクエストハンドラのパラメータを取得するために、解析する必要があるリクエストを受け取るサーバがあります。また、構文解析ハンドラとリクエストハンドラの両方が何らかの方法で失敗する可能性があります(パーサーの場合はパラメータがなくなり、reqハンドラの場合はデータベースのエラー)。したがって、以下のコードの「ステータス」です。要求ハンドラはもちろん、私がクライアントに返す必要のある何らかの応答を返します。関数から複数の値と状態/エラーを返す

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)など、他のいくつかの組み合わせ

(PARAMS異なるパラメータのため、各タイプのコンテナのいくつかの種類であろう私は別の "Params"タイプを持っています。また、「&」はポインタや参照を意味する可能性がありますが、私はC++を使用していますが、質問には関係ありません)

どちらが一番簡単で、

は***同様の質問がたくさんありますが、どれも「状態」の部分が含まれていないので、私は私の心はまだ

答えて

0

これは本当にない言語に依存しないことなどの言語機能に依存することはできません。たとえば、Javaで私はこのようにします:

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) 
} 

だからstatusは、それが良い状態であれば、それは悪い状態と例外がある場合だけは例外です。詳細については、statusフィールドのカスタム例外とすることができます。

プログラミング言語で例外を使用できない場合は、たとえばpass by value(&status)を使用できます。しかし、結果を渡してステータスを返さないでください。結果を返します。 parseの結果は、状態ではなく解析されたparamsです。

+1

問題は、エラーが必ずしも例外であるとは限りません。たとえば、ユーザーが間違ったパスワードでログインしたい場合は、それが「例外」であるとは言いません。ここでは、レスポンスはトークンであり、パスワードが間違っていればヌルトークンを返すようには思われません。 – Chrischpo

+1

ユーザーが誤ったパスワードでログインしようとすると、それは間違いなく401/403 httpステータスに解決される例外です。パスワードチェック機能は 'null'を返しません。それは例外をスローします(何も返しません)。例外の仕組みを知っていますか?関数が例外をスローすると、 'null'を返しません。何も返さず、コード実行フローは 'catch'ブロックにジャンプします。 – djxak

+1

はい、私は例外の動作を知っています。私はちょうど間違ったパスワードは例外ではないと考えています。例外的なことではないので、間違ったパスワードを入力することは非常に一般的です。だから、私の意図したことは、あなたのコードで何かが間違っていたのかどうかを知る方法はないが、例外を投げなかったということだった。 – Chrischpo

関連する問題