try ブロックには、例外を発生させる可能性がある保護されたコードが含まれます。ブロックは、例外がスローされるか、ブロックが正常に終了するまで実行されます。たとえば、次の例では null オブジェクトをキャストしようとすると、NullReferenceException 例外が発生します。
object o2 = null;
try
{
int i2 = (int)o2; // Error
} catch 句は、引数なしで使用できます。引数を指定せずに使用するとあらゆる例外がキャッチされ、汎用的な catch 句と見なされます。また、System.Exception から派生したオブジェクト引数を使用することもできます。その場合は、特定の例外が処理されます。次に例を示します。
catch (InvalidCastException e)
{
} 特定の catch 句は、同一の try-catch ステートメントで複数使用できます。この場合、catch 句は順序どおりにチェックされるため、catch 句の順序が重要になります。例外は、特定性の高い順にキャッチしてください。
throw ステートメントは、catch ステートメントでキャッチされた例外を再びスローするために catch ブロックで使用できます。次に例を示します。
catch (InvalidCastException e)
{
throw (e); // Rethrowing exception e
} パラメータのない catch 句で処理された例外を再スローする場合、引数のない throw ステートメントを使用します。次に例を示します。
try ブロック内では、そこで宣言されている変数だけを初期化します。外部で宣言された変数を初期化すると、ブロックの実行が完了する前に例外が発生する可能性があるためです。たとえば、以下のコード例では、変数 x が try ブロック内で初期化されます。この変数を try ブロックの外側にある Write(x) ステートメントで使おうとすると、コンパイラ エラー "未割り当てのローカル変数 'var' が使用されました。" が発生します。
static void Main()
{
int x;
try
{
// Don't initialize this variable here.
x = 123;
}
catch
{
}
// Error: Use of unassigned local variable 'x'.
Console.Write(x);
} catch の詳細については、「try-catch-finally」を参照してください。