【问题标题】:Catch, Handle, then Rethrow Exception?捕获,处理,然后重新抛出异常?
【发布时间】:2010-11-06 06:09:54
【问题描述】:

我今天遇到了一个有趣的困境。我有一个处理信息并检查重复值的函数,然后返回下一个不重复的数字。所以,我有这样的事情:

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 值退出函数。我是否以错误的方式考虑try/catch,还是有办法解决这个问题?

【问题讨论】:

    标签: vb.net exception try-catch structured-exception


    【解决方案1】:

    如果您捕获到异常并从中恢复(使用您的 IncrementToNonDuplicate...),那么就没有理由再抛出异常了。 catch 和 end try 之间的代码应该只清理资源,例如关闭文件或数据读取器(如果您要重新抛出它)。

    您宁愿返回一个结构,其中包含 NonDuplicate 值和有关函数错误的所需信息。 另一种方法是抛出一个自定义异常,该异常将包含诸如“无效数字:它应该是......)之类的信息。)

    【讨论】:

      【解决方案2】:

      您可以返回一个布尔值,指示是否找到重复项,并更改要通过引用传入的参数,以便更新值。

      Public Function GetNextNonDuplicateNumber(ByRef NonDupeNumber as Long) as Boolean
      

      【讨论】:

      • 这实际上是一个更合理的方法,并且模仿Int32.TryParse等。 (7 年后,我知道,但这应该是 OP 的选择)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-10
      • 2011-06-27
      • 2012-09-15
      • 2012-04-26
      • 2015-10-13
      • 2021-04-01
      相关资源
      最近更新 更多