2009-06-26 54 views
1

今天我遇到了一個有趣的困境。我有一個處理信息並檢查重複值的函數,然後返回下一個不重複的數字。所以,我有這樣的事情:抓住,處理,然後重新生成異常?

Public Function GetNextNonDuplicateNumber(NumberToCheck as Long) as Long 

     //the non-duplicate the function will return 
     Dim NonDuplicate as Long 

     If CheckForDuplicate(NumberToCheck) = True Then 
      Throw New DuplicateException() 
     Else 
      NonDuplicate = NumberToCheck 
     End If 

End Function 

然後,在我有一個catch塊,通過增加處理重複功能的底部,直到我沒有複製任何更多的,是這樣的:

Catch ex as DuplicateException 
    NonDuplicate = IncrementToNonDuplicateValue(NumberToCheck) 
    Throw ex 
    Return NonDuplicate 
End Function 

正如你所看到的,我想要特別處理異常,但是我也想在完成時拋出異常,因爲我想警告函數外的其他代碼。

問題是,只是拋出它退出功能與null值。我是在想一個錯誤的方式,還是有辦法解決這個問題?

回答

3

如果您發現異常並從中恢復(使用您的IncrementToNonDuplicate ...),則沒有理由再拋出異常。 catch和end try之間的代碼應該清理資源,如關閉文件或數據庫,如果你要重新拋出它。

您可能更願意返回一個包含NonDuplicate值和必需的函數錯誤信息的結構。 另一種方法是拋出一個自定義異常,其中包含諸如「無效數字:應該是...」的信息

1

您可以返回一個布爾值,指示是否找到重複項,並更改要傳入的參數通過參考這樣你就可以更新值。

Public Function GetNextNonDuplicateNumber(ByRef NonDupeNumber as Long) as Boolean 
+0

這實際上是一個更佳的措施,並模仿`Int32.TryParse`等。(7年後,我知道了,不過,這應該是OP的選擇路徑)。 – Abel 2016-12-18 03:42:59