2009-04-15 54 views
0

假設你有下面的代碼塊:如何處理無效的執行狀態?

if (Light.On) { 
    // do something... 
} else if (Light.Off) { 
    // do something else... 
} else { 
    // this state should never be reached 
} 

現在假設應用程序邏輯決定了在這部分代碼,最後的狀態不應該達到,但它是不是可以在確定編譯時間。也許還有其他的狀態(例如Light.Broken)可以由應用程序的其他部分設置,但這裏沒有使用。

您在最後的else區塊中添加了哪些代碼?

  1. 不添加任何代碼,因爲無論如何都不應該添加代碼。
  2. 添加一些日誌功能,以便您作爲開發人員知道已經達到了一些非法狀態。
  3. 拋出一個異常,因爲不能到達狀態,並且無論如何都要到達,否則一定是錯誤的。

第一個選項似乎沒有合理的我,希望不順心的權似乎根本沒有正確的選擇。選項二的優勢在於您的應用程序不會立即崩潰,因此如果發生這種情況的情況在罕見的情況下未能在測試中發現,那麼客戶可以繼續使用該應用程序,並向開發人員通知問題。選項三會導致應用程序崩潰,這顯然不是您希望客戶體驗到的事情,但它確實表明出現問題。

處理這種情況的最佳方法是什麼?

EDIT,基於評論:

一些附加的考慮來操縱討論:

  • 它包含上述代碼不允許任何其他值,以在被設定的方法的合同那一刻然後打開和關閉。
  • 假設代碼位於應用程序的非關鍵部分。

回答

6

在開發中 - 難以實現並且快速失敗。拋出某種運行時異常,或者只是斷言(false)。

在發佈 - 優雅地關閉。你的應用程序處於無法使用的狀態,並且你不能真正執行你通常會做的任何事情,例如類不變量等。給用戶一個機會來保存這些工作,例如,嘗試記錄一個可以發回給開發團隊,然後關機。

編輯:基於添加的評論。

如果函數的契約聲明在函數入口處燈開啓或關閉,則任何其他狀態都是錯誤。根據我原來的回答中列出的原則,該功能應該失敗。

關於'非關鍵'aspaect - 如果函數前提條件未得到滿足,則意味着您的應用程序已損壞。無論在非關鍵代碼段中是否檢測到錯誤,這並不意味着問題本身並不重要 - 您無法知道創建無效狀態的錯誤也不會影響關鍵代碼區域。

+0

你如何實現這樣的解決方案?你實際上是否實現了一些「開發」標誌,並將錯誤處理的基礎價值?在我看來,這樣做不會使代碼非常乾淨...... – Daan 2009-04-15 07:55:41

+0

我們的構建腳本提示輸入版本號。如果提供了一個reelase構建完成,如果它不是版本被標記爲工程發佈。在運行時我們有一個標準的錯誤報告功能,相應的行爲。 – PaulJWilliams 2009-04-15 08:01:49

+0

從Java 1.4開始,您還可以使用生成AssertionError的assert指令。默認情況下,斷言在運行時會被忽略(表現爲無操作),但您可以使用-ea JVM開關啓用它們。 – 2009-04-15 08:58:32

0

第三個選項是正確的,就像對於那個部分其他任何狀態都是無效的,所以它應該拋出和異常說無效狀態。

2

嗯......這要看。有一個布爾測試的第三種情況會讓我想哭。這只是噪音,增加了混亂,並告訴我開發者至少感到困惑,因爲它讓我感覺到。

對於一個非布爾值,我想你可以做任何事......如果if s捕獲與所討論的代碼相關的狀態,那麼忽略其他情況就沒有什麼壞處。如果未來有可能需要進一步處理案例,爲了清晰起見,評論可能足以表明這一點。

0

不要做任何事情。如果你關心的是燈是否亮:

if (Light.On) { 
    // do some work 
} else { 
    // too darned dark to work 
} 

否則你應該枚舉你所有的狀態。

如果其他國家不被允許,你應該錯誤。如果他們被允許但不相關,就忽略它們。通過正確設計的代碼,沒有問題。

你這裏的主要問題在於一個設計可以同時設置Light.On和Light.Off。你應該使用一個狀態Light.State,它被設置爲{on,閃爍,關閉,斷開,不插電,爆炸,emit_dangerous_gamma_rays}之一等等。

0

拋出異常。

正如你所說,第三種情況不應該發生。如果確實發生了,那麼出現了問題,而且你不知道還有什麼可能會出錯。

您也不希望調用代碼認爲代碼正常工作時,它實際上失敗。

此外,它發現之前,它更容易發現問題。

1

如前所述,在開發階段,您應該儘快使其可見。在發佈階段,它取決於達到這種無效狀態的關鍵程度。

最不重要的是發出一個日誌用於調試目的。

然後,您可以嘗試通過回到先前的有效狀態或轉到新的有效狀態來從此無效狀態恢復。

最後,如果沒有安全措施可以完成,您可以終止執行(對用戶發出警報並將日誌發送給維護人員)。

0

在開發版本中,只是拋出異常。

在發行版:

  • 拋出一個異常
  • 保存用戶在如果可能的話
  • 保存一些臨時文件的故障轉儲和(使用小助手應用程序)工作,爲用戶提供選項發送給你,所以你可以識別和修復問題