try-catch ステートメントは、try ブロックと、それに続く catch 句で構成されます。この句にはさまざまな例外のハンドラを指定します。
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」を参照してください。
例外を発生させる可能性がある MyMethod() メソッドへの呼び出しを含む try ブロックの例を次に示します。catch 句には、メッセージを画面に表示するだけの例外ハンドラがあります。throw ステートメントが MyMethod の内側から呼び出されると、システムは catch ステートメントを検索し、メッセージ "Exception caught" を表示します。
// try_catch_example.cs
using System;
class MainClass
{
static void ProcessString(string s)
{
if (s == null)
{
throw new ArgumentNullException();
}
}
static void Main()
{
try
{
string s = null;
ProcessString(s);
}
catch (Exception e)
{
Console.WriteLine("{0} Exception caught.", e);
}
}
}
サンプル出力
System.ArgumentNullException: Value cannot be null.
at MainClass.Main() Exception caught.
2 つの catch ステートメントを使用する例を次に示します。最初にある、特定性の最も高い例外がキャッチされます。
// try_catch_ordering_catch_clauses.cs
using System;
class MainClass
{
static void ProcessString(string s)
{
if (s == null)
{
throw new ArgumentNullException();
}
}
static void Main()
{
try
{
string s = null;
ProcessString(s);
}
// Most specific:
catch (ArgumentNullException e)
{
Console.WriteLine("{0} First exception caught.", e);
}
// Least specific:
catch (Exception e)
{
Console.WriteLine("{0} Second exception caught.", e);
}
}
}
サンプル出力
System.ArgumentNullException: Value cannot be null.
at MainClass.Main() First exception caught.
前述の例で、特定性の最も低い catch 句から始めると、エラー メッセージ "A previous catch clause already catches all exceptions of this or a super type ('System.Exception')" が表示されます。
ただし、特定性の最も低い例外をキャッチするには、throw ステートメントを次のものと置き換えます。
throw new Exception();
詳細については、「C# 言語仕様」の次のセクションを参照してください。
処理手順
方法 : 例外を明示的にスローする
関連項目
C# のキーワード
The try, catch, and throw Statements
例外処理ステートメント (C# リファレンス)
throw (C# リファレンス)
try-finally (C# リファレンス)
概念
C# プログラミング ガイド
その他の技術情報
C# リファレンス