微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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语句中的特殊子句作为过滤器。

原文地址:https://www.jb51.cc/vb/256182.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐