2009-06-26 69 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