Share via


Een niet-CLS-uitzondering ondervangen

In sommige .NET-talen, waaronder C++/CLI, kunnen objecten uitzonderingen genereren die niet zijn afgeleid van Exception. Dergelijke uitzonderingen worden niet-CLS-uitzonderingen of niet-uitzonderingen genoemd. In C# kunt u geen niet-CLS-uitzonderingen genereren, maar u kunt ze op twee manieren vangen:

  • Binnen een catch (RuntimeWrappedException e) blok.

    Een Visual C#-assembly onderschept standaard niet-CLS-uitzonderingen als verpakte uitzonderingen. Gebruik deze methode als u toegang nodig hebt tot de oorspronkelijke uitzondering, die toegankelijk is via de RuntimeWrappedException.WrappedException eigenschap. Verderop in dit onderwerp wordt uitgelegd hoe u uitzonderingen op deze manier kunt ondervangen.

  • Binnen een algemeen catch-blok (een catch-blok zonder een opgegeven uitzonderingstype) dat na alle andere catch blokken wordt geplaatst.

    Gebruik deze methode als u een bepaalde actie (zoals schrijven naar een logboekbestand) wilt uitvoeren als reactie op niet-CLS-uitzonderingen en u geen toegang nodig hebt tot de uitzonderingsgegevens. De algemene taalruntime verpakt standaard alle uitzonderingen. Als u dit gedrag wilt uitschakelen, voegt u dit kenmerk op assemblyniveau toe aan uw code, meestal in het AssemblyInfo.cs-bestand: [assembly: RuntimeCompatibilityAttribute(WrapNonExceptionThrows = false)].

Een niet-CLS-uitzondering ondervangen

Open binnen een catch(RuntimeWrappedException e) blok de oorspronkelijke uitzondering via de RuntimeWrappedException.WrappedException eigenschap.

Opmerking

In het volgende voorbeeld ziet u hoe u een niet-CLS-uitzondering kunt ondervangen die is gegenereerd uit een klassebibliotheek die is geschreven in C++/CLI. In dit voorbeeld weet de C#-clientcode van tevoren dat het uitzonderingstype dat wordt gegenereerd een System.String. U kunt de RuntimeWrappedException.WrappedException eigenschap terugzetten op het oorspronkelijke type zolang dat type toegankelijk is vanuit uw code.

// 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);
    }
}

Zie ook