Megosztás a következőn keresztül:


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

Lásd még