给定 C# 中的以下代码:
public void CatchExceptionThenThrow()
{
try
{
StartThings();
}
catch (Exception)
{
throw;
}
}
我已经使用 dotnetfiddle VB.net 转换器将其转换为 VB:
Public Sub CatchExceptionThenThrow()
Try
StartThings()
Catch As Exception
Throw
End Try
End Sub
这会引发编译错误:
Catch As Exception
预计声明结束
然后我将其更改为:
Public Sub CatchExceptionThenThrow()
Try
StartThings()
Catch ex As Exception
Throw
End Try
End Sub
但这会产生一个警告"已声明但从未使用的变量"。 如何在没有收到警告的情况下throw
而不是在 VB 中throw ex
,同时保留整个堆栈跟踪,如第一个 C# 示例中所示?
所有好的评论,并感谢您的冗余信息,我意识到完全不需要尝试/捕获,因为无论有没有尝试/捕获,都会发生这种情况。这个问题更多的是为了好奇心,我想,在(好的代码)现实中没有真正的基础的情况下。
我最近在一篇关于异常处理以及为什么要throw
vs throw ex
的博客文章中看到了类似的东西,并且只是好奇如何在 VB 中完成相同的代码 - 因为我对 VB 并不强,并且正在尝试更好地理解它和异常处理。
曾希望我能够找到我上面引用的博客文章,但无法找到。 可以找到它的要点(产生问题):https://dotnetfiddle.net/741wAi
只需有一个空Catch
,如下所示:
Try
StartThings()
Catch
Throw
End Try
但是,如果你除了重新扔掉它之外没有在Catch
块中做任何事情,那么try-catch
就没有必要排在第一位。
您可以在没有 try-catch 的情况下StartThings()
,如果发生异常,异常将传播到调用方。
您收到 Catch ex As Exception
警告的原因是您在变量 ex
中捕获了异常,但您没有在任何地方使用它。
如果你只是抓住Exception
那么你的代码是多余的,正如已经指出的那样。但是,如果您正在简化示例代码,并且您尝试仅捕获特定类型的异常并为其他抛出的Exception
进行其他处理,那么我不想向您打破它,但似乎 VB 无法真正做到这一点,所以您将不得不忍受警告。显然不要扔前任。