问题: C# 中的普通throw
语句本身会导致新的异常吗?
请注意,我问这个问题是出于好奇,而不是因为我有任何实际或现实世界的情况很重要。另请注意,我的直觉和经验告诉我答案是“否”,但我希望以某种方式验证该答案(请参阅迄今为止我尝试过的资源)。
这是一些示例代码来说明我的问题:
try
{
int x = 0, y = 1 / x;
}
catch (Exception outerException)
{
try
{
throw;
}
catch (Exception innerException)
{
// Q: Does this Assert ever fail??
System.Diagnostics.Debug.Assert(outerException.Equals(innerException));
}
}
我想知道是否有任何方法可以改变这种情况,从而Assert
导致失败,而不会触及内部try/catch
块。
我已经尝试或正在尝试回答这个问题:
- 阅读 MSDN 上的throw (C# Reference)页面 - 没有明确的答案;
- 检查了C# 语言规范的第 5.3.3.11 部分——这可能是查找此类信息的错误位置;
- 通过我可以尝试在 throw 语句上触发的异常进行修饰。OutOfMemoryException 浮现在脑海中,但在
throw
. - 打开 ILDASM 以检查生成的代码。我可以看到它
throw
转换为一条rethrow
指令,但我不知道去哪里进一步检查该语句是否可以抛出异常。
这是 ILDASM 显示的内部try
位:
.try
{
IL_000d: nop
IL_000e: rethrow
} // end .try
所以,总结一下:一个 throw 语句(用于重新抛出异常)本身会导致异常吗?