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