次の方法で共有


方法 : CLS 準拠でない例外をキャッチする

C++、CLI を含む一部の .NET 言語では、オブジェクトは、Exception から派生していない例外をスローできます。 このような例外をCLS 準拠でない例外、または Exception クラスから派生していない例外と呼びます。 Visual C# では、CLS 準拠でない例外をスローすることはできませんが、これらの例外を次の 2 とおりの方法でキャッチできます。

  • catch (Exception e) ブロック内で RuntimeWrappedException としてキャッチ。

    既定では、Visual C# アセンブリは CLS 準拠でない例外をラップされた例外としてキャッチします。 WrappedException プロパティからアクセスできる元の例外にアクセスする必要がある場合は、この方法を使用します。 この方法で例外をキャッチする方法については、このトピックで後述する手順で説明します。

  • catch (Exception) ブロックか catch (Exception e) ブロックの後ろに置かれた汎用の catch ブロック (例外の型が指定されていない catch ブロック) 内でキャッチ。

    CLS 準拠でない例外に対して何らかのアクションを実行する必要があり、例外情報にアクセスする必要がない場合は、この方法を使用します。 既定では、共通言語ランタイムはすべての例外をラップします。 この動作を無効にするには、アセンブリレベルの属性 [assembly: RuntimeCompatibilityAttribute(WrapNonExceptionThrows = false)] をコード ファイル (厳密には AssemblyInfo.cs ファイル) に追加します。

CLS 準拠でない例外をキャッチするには

  1. catch(Exception e) block内で as キーワードを使用して、e を RuntimeWrappedException にキャストできるかどうかをテストします。

  2. WrappedException プロパティから元の例外にアクセスします。

使用例

次の例では、C++ または CLR で記述されたクラス ライブラリからスローされた CLS 準拠でない例外をキャッチする方法を示します。 この例では、Visual C# クライアント コードは、スローされる例外の型が System.String であることを事前に認識しています。 コードからこの型にアクセスできる場合は、WrappedException プロパティを元の型にキャストできます。

// Class library written in C++/CLR.
   ThrowNonCLS.Class1 myClass = new ThrowNonCLS.Class1();

   try
   {
    // throws gcnew System::String(
    // "I do not derive from System.Exception!");
    myClass.TestThrow(); 
   }
   

   catch (Exception e)
   {
    RuntimeWrappedException rwe = e as RuntimeWrappedException;
    if (rwe != null)    
    {
      String s = rwe.WrappedException as String;
      if (s != null)
      {
        Console.WriteLine(s);
      }
    }
    else
    {
       // Handle other System.Exception types.
    }
   }           

参照

参照

例外と例外処理 (C# プログラミング ガイド)

RuntimeWrappedException