CLI標準(パーティションIIA、第19章)およびSystem.Reflection.ExceptionHandlingClauseOptions
列挙型のMSDNリファレンスページによると、 4つの異なる種類の例外ハンドラブロックがあります。
- catch句:「指定されたタイプのすべてのオブジェクトをキャッチします。」
- filter句:「フィルターが成功した場合にのみハンドラーを入力してください。」
- finally節:「すべての例外と通常の終了を処理します。」
- 障害句:「すべての例外を処理しますが、通常の終了は処理しません。」
これらの簡単な説明(CLI標準から引用)を考えると、これらは次のようにC#にマップする必要があります。
- キャッチ—
catch (FooException) { … }
- フィルタ— C#では使用できません(ただし、VB.NETでは
Catch FooException When booleanExpression
) - 最後に—
finally { … }
- 障害—
catch { … }
実験:
簡単な実験では、このマッピングは.NETのC#コンパイラが実際に行うことではないことが示されています。
// using System.Linq;
// using System.Reflection;
static bool IsCatchWithoutTypeSpecificationEmittedAsFaultClause()
{
try
{
return MethodBase
.GetCurrentMethod()
.GetMethodBody()
.ExceptionHandlingClauses
.Any(clause => clause.Flags == ExceptionHandlingClauseOptions.Fault);
}
catch // <-- this is what the above code is inspecting
{
throw;
}
}
このメソッドはを返しますfalse
。つまりcatch { … }
、障害句として発行されていません。
clause.Flags == ExceptionHandlingClauseOptions.Clause
同様の実験では、例外タイプが指定されていなくても、実際にはcatch句が発行された( )ことが示されています。
質問:
- 本当にcatch節である場合
catch { … }
、fault節はcatch節とどのように異なりますか? - C#コンパイラはfault句を出力しますか?