Dela via


Så här fångar du ett icke-CLS-undantag

Vissa .NET-språk, inklusive C++/CLI, tillåter objekt att utlösa undantag som inte härleds från Exception. Sådana undantag kallas icke-CLS-undantag eller icke-undantag. I C# kan du inte utlösa icke-CLS-undantag, men du kan fånga dem på två sätt:

  • Inom ett catch (RuntimeWrappedException e) block.

    Som standard fångar en Visual C#-sammansättning icke-CLS-undantag som omslutna undantag. Använd den här metoden om du behöver åtkomst till det ursprungliga undantaget, som kan nås via egenskapen RuntimeWrappedException.WrappedException . I proceduren senare i det här avsnittet beskrivs hur du fångar undantag på det här sättet.

  • Inom ett allmänt catch-block (ett catch-block utan en angiven undantagstyp) som placeras efter alla andra catch block.

    Använd den här metoden när du vill utföra en åtgärd (till exempel att skriva till en loggfil) som svar på icke-CLS-undantag och du inte behöver åtkomst till undantagsinformationen. Som standard omsluter common language runtime alla undantag. Om du vill inaktivera det här beteendet lägger du till det här attributet på sammansättningsnivå i koden, vanligtvis i filen AssemblyInfo.cs: [assembly: RuntimeCompatibilityAttribute(WrapNonExceptionThrows = false)].

Så här fångar du ett icke-CLS-undantag

I ett catch(RuntimeWrappedException e) block får du åtkomst till det ursprungliga undantaget via egenskapen RuntimeWrappedException.WrappedException .

Exempel

I följande exempel visas hur du fångar ett icke-CLS-undantag som har genererats från ett klassbibliotek skrivet i C++/CLI. Observera att C#-klientkoden i det här exemplet i förväg vet att undantagstypen som genereras är en System.String. Du kan återställa egenskapens RuntimeWrappedException.WrappedException ursprungliga typ så länge den typen är tillgänglig från koden.

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

try
{
    // throws gcnew System::String(  
    // "I do not derive from System.Exception!");  
    myClass.TestThrow();
}
catch (RuntimeWrappedException e)
{
    String s = e.WrappedException as String;
    if (s != null)
    {
        Console.WriteLine(s);
    }
}

Se även