Nem CLS-kivétel elfogása
Egyes .NET-nyelvek, beleértve a C++/CLI-t, lehetővé teszik az objektumok számára, hogy olyan kivételeket dobjanak ki, amelyekből nem származnak Exception. Az ilyen kivételeket nem CLS-kivételeknek vagy nem kivételeknek nevezzük. A C#-ban nem lehet CLS-kivételeket kivenni, de kétféleképpen érheti el őket:
Egy blokkon
catch (RuntimeWrappedException e)
belül.Alapértelmezés szerint egy Visual C#-szerelvény burkolt kivételként rögzíti a nem CLS-kivételeket. Ezt a módszert akkor használja, ha hozzá kell férnie az eredeti kivételhez, amely a RuntimeWrappedException.WrappedException tulajdonságon keresztül érhető el. A jelen témakör későbbi szakaszában ismertetett eljárás bemutatja, hogyan lehet ilyen módon elkapni a kivételeket.
Egy általános fogási blokkon belül (egy kivételtípus nélküli fogási blokk), amelyet az összes többi
catch
blokk után helyeznek el.Ezt a módszert akkor használja, ha valamilyen műveletet (például naplófájlba való írást) szeretne végrehajtani a nem CLS-kivételekre válaszul, és nem kell hozzáférnie a kivételadatokhoz. Alapértelmezés szerint a közös nyelvi futtatókörnyezet minden kivételt körbefuttat. A viselkedés letiltásához adja hozzá ezt a szerelvényszintű attribútumot a kódhoz, általában a AssemblyInfo.cs fájlban:
[assembly: RuntimeCompatibilityAttribute(WrapNonExceptionThrows = false)]
.
Nem CLS-kivétel elfogása
catch(RuntimeWrappedException e)
Egy blokkon belül a tulajdonságon keresztül érheti el az eredeti kivételtRuntimeWrappedException.WrappedException.
Példa
Az alábbi példa bemutatja, hogyan lehet elkapni egy nem CLS-kivételt, amelyet egy C++/CLI nyelven írt osztálytárból dobtak ki. Vegye figyelembe, hogy ebben a példában a C#-ügyfélkód előre tudja, hogy a kivétel System.Stringtípusa egy . Visszaadhatja a RuntimeWrappedException.WrappedException tulajdonság eredeti típusát, ha az elérhető a kódból.
// 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);
}
}