VB.NET尝试捕捉多个捕获块

这是一个很奇怪的问题。我们有一个尝试捕获与多个捕获块。第一个Catch块没有代码,只是一个注释。
Try
  'Some Code
Catch ex As ThreadAbortException
  'Do Nothing
Catch ex As Exception
  HandleException(ex)
End Try

如果抛出ThreadAbortException以外的异常,它将被第二个Catch捕获,如预期的那样。然而,当在VS2010中通过代码,ex对象是Nothing在这种情况下。到目前为止,我们已经找到两种方法来“解决”这个问题。

修正1:
重命名第一个异常变量。

Try
  'Some Code
Catch tex As ThreadAbortException
  'Do Nothing
Catch ex As Exception
  HandleException(ex)
End Try

修复2:将任何代码行添加到第一个Catch块。

Try
  'Some Code
Catch ex As ThreadAbortException
  Dim i As Integer = 1
Catch ex As Exception
  HandleException(ex)
End Try

在上述任何情况下,HandleException中的代码似乎仍然正常运行,如果它运行。这是Visual Studio或调试器中的错误吗?或者我们缺少这里的东西,上面的第一个代码块是无效的?

这是所有在.NET 4.0。

Teejay有正确的答案。

但是,如果你的Catch块是空的,处理这个异常根本没有意义。你只是想防止最后一个块捕捉它。你可以使用你的方法 – 但是认为有一个空的Catch块通常是不可接受的:异常应该不被捕获,或应该正确处理;默默吞下他们必须被视为一个错误。你的case是这个规则的一个例外,但因为它需要被记录在代码中,否则它会混淆仔细的维护者。

嗯,VB有一个特殊的成语,正是这种情况:

Try
    ' …
Catch ex As Exception When Not TypeOf ex Is ThreadAbortException
    ' Only executed if `ex` isn’t a ThreadAbortException
End Try

这个代码根本不捕捉ThreadAbortException,这是正确的事情做,如果你不想处理它:ThreadAbortException不能被吞下,所以即使你抓住它,它将被重新推出在Catch块的结尾。

注意,这从根本上不同于SysDragon的答案,它使用传统的If语句,而这里的代码使用Catch语句中的特殊子句作为过滤器。

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...