Sdílet prostřednictvím


CA2102: Zachycujte výjimky bez CLSCompliant v obecné obslužné rutině

Název_typu

CatchNonClsCompliantExceptionsInGeneralHandlers

CheckId

CA2102

Kategorie

Microsoft.Security

Změnit rozdělení

Bez rozdělení

Příčina

Člen v sestavení, které nejsou označeny RuntimeCompatibilityAttribute nebo RuntimeCompatibility(WrapNonExceptionThrows = false) obsahuje blok catch, který zpracovává Exception a neobsahuje bezprostředně následující blok catch Obecné.Toto pravidlo ignoruje Visual Basic sestavení.

Popis pravidla

Bloku catch, který zpracovává Exception zachytává všechny výjimky vyhovující specifikaci společný jazyk (CLS).Nezachytí však vyhovující výjimky bez podpory CLS.Pokročilý vyhovující výjimky může být vyvolána z nativního kódu nebo spravovaný kód, který byl vygenerován Microsoft Non-CLS (MSIL) jazyk Assembler.Všimněte si, že C# a Visual Basic kompilátory Nepovolit bez podpory CLS vyhovující výjimky se vyvolá a Visual Basic nezachytí vyhovující výjimky bez podpory CLS.Pokud záměr bloku catch zpracovat všechny výjimky, použijte následující syntaxi bloku catch Obecné.

  • C#:catch {}

  • C++: catch(...) {} orcatch(Object^) {}

Kompatibilní s výjimkou neošetřené bez podpory CLS stane problém zabezpečení při odstranění dříve povolená oprávnění v bloku catch.Protože nejsou kompatibilní s výjimky bez podpory CLS zákazem, by mohl spustit škodlivý způsob, který výjimku mimo CLS kompatibilní s se zvýšenými oprávněními.

Jak opravit porušení

Oprava porušení tohoto pravidla, když je zachytit všechny výjimky, nahradit nebo přidat bloku catch obecné nebo označit sestavení RuntimeCompatibility(WrapNonExceptionThrows = true).Pokud jsou oprávnění odebrána v bloku catch, duplicitní funkce finančního blok catch.Pokud není záměr zpracovat všechny výjimky, nahradit bloku catch, který zpracovává Exception s bloky catch, které výjimky pro určité typy.

Při potlačení upozornění

Je bezpečné potlačí upozornění od tohoto pravidla, pokud testovaného bloku neobsahuje všechny příkazy, které pravděpodobně kompatibilní s výjimkou bez podpory CLS.Protože všechny nativní nebo spravovaný kód může throw nejsou CLS výjimka, to vyžaduje znalost všech kód, který mohou být provedeny ve všech cest kódu uvnitř bloku try.Všimněte si, že je kompatibilní s výjimky bez podpory CLS není vyvolána společného jazykového modulu runtime.

Příklad

Následující příklad ukazuje třída MSIL, která je kompatibilní s výjimku specifikaci CLS.

.assembly ThrowNonClsCompliantException {}
.class public auto ansi beforefieldinit ThrowsExceptions
{
   .method public hidebysig static void
         ThrowNonClsException() cil managed
   {
      .maxstack  1
      IL_0000:  newobj     instance void [mscorlib]System.Object::.ctor()
      IL_0005:  throw
   }
}

Následující příklad ukazuje způsob, který obsahuje obecné úlovku blok, který splňuje pravidla.

// CatchNonClsCompliantException.cs 
using System;

namespace SecurityLibrary
{
   class HandlesExceptions
   {
      void CatchAllExceptions()
      {
         try
         {
            ThrowsExceptions.ThrowNonClsException();
         }
         catch(Exception e)
         {
            // Remove some permission.
            Console.WriteLine("CLS compliant exception caught");
         }
         catch
         {
            // Remove the same permission as above.
            Console.WriteLine("Non-CLS compliant exception caught.");
         }
      }

      static void Main()
      {
         HandlesExceptions handleExceptions = new HandlesExceptions();
         handleExceptions.CatchAllExceptions();
      }
   }
}

Předchozí příklady takto kompilace.

ilasm /dll ThrowNonClsCompliantException.il
csc /r:ThrowNonClsCompliantException.dll CatchNonClsCompliantException.cs

Souvisejících pravidel

CA1031: Nezachycujte výjimky obecného typu

Viz také

Referenční dokumentace

Výjimky a jejich zpracování (Průvodce programováním v C#)

Ilasm.exe (IL Assembler)

Koncepty

Přepsání kontrol zabezpečení

Jazyková nezávislost a jazykově nezávislé komponenty