この問題の歴史的側面について言及した人はまだ誰もいません。
.NET では、 から派生していないオブジェクトをスローすることは合法Exception
です。(C# では合法ではありませんが、他のマネージ言語では合法です。) 多くの人はこの事実を認識していませんが、合法です。それはクレイジーなので、.NET 2.0 ではデフォルトが変更されました。例外ではないものをスローしようとすると、明らかに例外であるクラスに自動的にラップされRuntimeWrappedException
ます。その後、そのオブジェクトがスローされます。
この奇妙さのために、C# 1.0 では、両方を実行するコードがよく見られました。
try
{ do something }
catch(Exception)
{ handle the exception }
catch
{ handle the thrown non-exception }
実際、セキュリティと正確性の問題がありました。セキュリティ上の理由から、スローされたものをすべてキャッチする必要があり(おそらく再スローするために)、人々はそれcatch(Exception)
がすべてをキャッチしたと合理的に考えますが、そうではありませんでした。
幸いなことに、.NET 2.0 以降はより合理的になりました。に頼ることができcatch {}
、必要catch(Exception) {}
にcatch(Exception ex) {}
応じてすべてをキャッチできます。
そして最後に: なんらかの理由で C# 1.0 の動作を有効にしたい場合は、
[assembly:System.Runtime.CompilerServices.RuntimeCompatibility(WrapNonExceptionThrows = false)]
あなたのプログラムで。