问题: C#中的普通throw
语句是否会导致一个新的异常本身?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# Language Specification的5.3.3.11部分 - 这可能是寻找这种信息的错误地方;
- 掩盖了我可以尝试触发throw语句的异常。出现OutOfMemoryException异常,但在
throw
时很难触发。 - 打开ILDASM检查生成的代码。我可以看到,
throw
转换为rethrow
指令,但我迷失在哪里查看进一步检查该语句是否可以抛出异常。
这就是ILDASM显示内try
位:
.try
{
IL_000d: nop
IL_000e: rethrow
} // end .try
因此,要总结:可以在throw语句(用于重新抛出异常)不断原因异常本身?
除了令人满意的好奇心,你想解决什么问题? – Oded
只是好奇心我恐怕没有任何令人兴奋的(只要例外甚至可以令人兴奋)与此有关的现实世界的场景。 – Jeroen
我确实认为如果你的堆栈损坏可能会发生。在这种情况下,rethrow将尝试使用catch/finally/fault子句将堆栈展开到下一个方法。如果无法处理,将导致异常,但更有可能是ExecutionEngineException,这将导致正常的流程立即终止。 –