クリックして評価とフィードバックをお寄せください
MSDN
MSDN ライブラリ
Visual Studio 2005
Visual Studio ドキュメント
Visual C#
C# リファレンス
C# のキーワード
ステートメントの種類
例外処理ステートメント
 try-catch

  低帯域幅での表示をオンにする
このページは次のバージョンについて記述しています。
Microsoft Visual Studio 2005/.NET Framework 2.0

その他のバージョンについては、以下の情報を参照してください。
C# 言語リファレンス
try-catch (C# リファレンス)

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 ステートメントを使用します。次に例を示します。

catch
{
    throw;
}

try ブロック内では、そこで宣言されている変数だけを初期化します。外部で宣言された変数を初期化すると、ブロックの実行が完了する前に例外が発生する可能性があるためです。たとえば、以下のコード例では、変数 xtry ブロック内で初期化されます。この変数を 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# 言語仕様」の次のセクションを参照してください。

  • 5.3.3.13 try-catch ステートメント

  • 8.10 try ステートメント

  • 16 例外

コミュニティ コンテンツ   コミュニティ コンテンツとは
新しいコンテンツの追加 RSS  注釈
catch ブロック内では throw は引数無しで      Jitta   |   編集   |   履歴の表示

catch ステートメントでキャッチされた例外を再びスローするには、引数無しで throw を使用してください。

catch (Exception e) {
throw e; // e 例外を発生させる
}

とすると、スタック トレースがとぎれ、この throw が例外を発生させた場所になってしまいます。

catch (Exception e) {
// e を使って何かする
throw; // e を再スロー
}

としましょう。

詳しくは、『C# 言語仕様』の 「8.9.5 The throw statement」をご覧ください。

フラグの設定 ContentBug
Processing
© 2009 Microsoft Corporation. All rights reserved. 使用条件  |  商標  |  プライバシー
Page view tracker