我個人的指導(dǎo)方針是:當(dāng)發(fā)現(xiàn)當(dāng)前代碼塊的基本假設(shè)為假時,拋出異常。
示例1:假設(shè)我有一個函數(shù),它應(yīng)該檢查任意類,如果該類繼承List<>,則返回true。這個函數(shù)提出一個問題:“這個對象是列表的后代嗎?”這個函數(shù)不應(yīng)該拋出異常,因為它的操作中沒有灰色區(qū)域-每個類都繼承或不繼承List<>,所以答案總是“或”否“。
示例2:假設(shè)我有另一個函數(shù),它檢查一個列表<>,如果它的長度大于50,返回true;如果長度小于50,則返回false。這個函數(shù)會問這樣一個問題:“這個列表有50多個項目嗎?”但是這個問題做了一個假設(shè)-它假設(shè)它給出的對象是一個列表。如果我給它一個空,那么這個假設(shè)是錯誤的。在這種情況下,如果函數(shù)返回任一千真萬確或如果是假的,那么它就違反了自己的規(guī)則。函數(shù)不能返回什么都行并聲稱它正確地回答了這個問題。所以它不會返回-它會拋出一個異常。
這與“滿載問題”邏輯謬誤。每個函數(shù)都會問一個問題。如果它所提供的輸入使這個問題成為一個謬誤,那么拋出一個異常。這一行很難用返回void的函數(shù)繪制,但底線是:如果函數(shù)對其輸入的假設(shè)被違反,它應(yīng)該拋出異常,而不是正常返回。
這個等式的另一面是:如果你發(fā)現(xiàn)你的函數(shù)經(jīng)常拋出異常,那么你可能需要改進(jìn)它們的假設(shè)。