.Net ではあらゆるクラスの例外が許可されますが、C# では throw と catch が Exception に制限されます。タイプも変数も指定しない catch 節を使用して、例外以外の例外をキャッチします。
関連する仕様の抜粋:
catch 句でクラス型を指定する場合、型は System.Exception から派生した型、または System.Exception (またはそのサブクラス) を有効な基本クラスとして持つ型パラメーター型である必要があります。
catch 句でクラス型と識別子の両方を指定すると、指定された名前と型の例外変数が宣言されます。例外変数は、catch ブロックに及ぶスコープを持つローカル変数に対応します。catch ブロックの実行中、例外変数は現在処理中の例外を表します。明確な割り当てのチェックのために、例外変数はそのスコープ全体で確実に割り当てられていると見なされます。
catch 句に例外変数名が含まれていない限り、catch ブロック内の例外オブジェクトにアクセスすることはできません。
例外の種類も例外変数名も指定しないcatch句を汎用catch句と呼びます。try ステートメントには、一般的な catch 句を 1 つだけ含めることができます。1 つ存在する場合は、最後の catch 句にする必要があります。
一部のプログラミング言語は、System.Exception から派生したオブジェクトとして表現できない例外をサポートする場合がありますが、そのような例外は C# コードでは生成できません。一般的な catch 句を使用して、そのような例外をキャッチできます。したがって、一般的な catch 句は、型 System.Exception を指定するものとは意味的に異なります。前者は、他の言語からの例外もキャッチする可能性があります。
.Net 4.0 では、Java の Error クラスに似た概念が導入されています。Corrupted State Exceptions は Exception を拡張しますが、HandleProcessCorruptedStateExceptionsAttributeを持つメソッドのみがCSE をキャッチします。