2016-06-11 44 views
0

我有一個服務器接收請求,我必須解析以獲取請求處理程序使用的參數。此外,解析和請求處理程序都可能以某種方式失敗(例如:對於解析器,缺少參數;對於請求處理程序:數據庫中存在一些錯誤),因此下面代碼中的「狀態」。請求處理程序當然會給出某種迴應,然後我必須發回給客戶端。從函數返回多個值和狀態/錯誤

所以我無法決定哪下列選項我應該在「主」使用,因爲我想保持從處理器中分離解析器:

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將某種對於不同參數的容器,所以爲每種類型的請求我會有一個不同的「參數」類型。此外,「&」可能意味着指針或參考,我使用的是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字段進行自定義例外。

如果編程語言不能使用例外,那麼您可以使用按值傳遞(&status)。但不要通過結果,返回狀態。返回結果。 parse的結果是解析的參數,而不是狀態。

+1

事情是,錯誤不一定是例外。例如,如果用戶想用錯誤的密碼登錄,我不會說這是一個「例外」。這裏的響應將是一個令牌,如果密碼錯誤,則返回空令牌似乎不太確定。 – Chrischpo

+1

如果用戶嘗試使用錯誤的密碼登錄,那肯定是一個例外,它應該解析爲401/403 http狀態。密碼檢查功能不會返回null。它會拋出一個異常(不返回任何內容)。你知道例外是如何工作的嗎?如果函數拋出一個異常,它不會返回'null'。它不返回任何內容,並且代碼執行流程跳轉到'catch'塊。 – djxak

+1

是的,我知道異常是如何工作的。我只是不認爲一個錯誤的密碼是一個例外,因爲它不是例外,用戶輸入一個錯誤的密碼是很常見的。所以我的意思是,在你的代碼中,沒有辦法確定是否出錯,但沒有拋出異常。 – Chrischpo