gpt4 book ai didi

.net - VB.NET 使用多个 Catch block 尝试 Catch

转载 作者:行者123 更新时间:2023-12-03 10:42:55 28 4
gpt4 key购买 nike

这是一个非常奇怪的问题。我们有一个带有多个 Catch block 的 Try Catch。第一个 Catch block 没有代码,只是一个注释。

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 block 。
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 block 是空的,处理这个异常完全没有意义。您只想阻止最后一个 block 捕获它。你可以使用你的方法——但考虑到有一个空的 Catch block 通常是 Not Acceptable :异常不应该被捕获,或者应该被正确处理;默默地吞下它们必须被视为一个错误。您的案例是此规则的一个异常(exception),但因此需要在代码中记录,否则会混淆细心的维护人员。

好吧,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 的末尾被重新抛出堵塞。

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

关于.net - VB.NET 使用多个 Catch block 尝试 Catch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14381963/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com