这是一个很奇怪的问题。我们有一个尝试捕获与多个捕获块。第一个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
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语句中的特殊子句作为过滤器。