質問: 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 のスロー (C# リファレンス)ページを読んでください - 決定的な答えはありません。
- C# 言語仕様の 5.3.3.11 の部分を確認しました。これは、この種の情報を探すにはおそらく間違った場所です。
- throw ステートメントでトリガーしようとする可能性がある例外について詳しく説明しました。OutOfMemoryException が頭に浮かびますが、
throw
. - 生成されたコードを確認するために ILDASM を開きました。
throw
それが命令に変換されることはわかりますがrethrow
、そのステートメントが例外をスローできるかどうかを確認するためにどこを調べればよいかわかりません。
try
これは、内部ビットについて ILDASM が示すものです。
.try
{
IL_000d: nop
IL_000e: rethrow
} // end .try
要約すると、(例外を再スローするために使用される) throw ステートメント自体が例外を引き起こすことはありますか?