Udostępnij za pośrednictwem


CA2102: Przechwytuj wyjątki inne niż CLSCompliant w ogólnej obsłudze wyjątków

Pozycja Wartość
Ruleid CA2102
Kategoria Microsoft.Security
Zmiana powodująca niezgodność Niezgodność

Przyczyna

Element członkowski w zestawie, który nie jest oznaczony znakiem RuntimeCompatibilityAttribute lub jest oznaczony RuntimeCompatibility(WrapNonExceptionThrows = false) , zawiera blok catch, który obsługuje System.Exception i nie zawiera bezpośrednio następującego ogólnego bloku catch. Ta reguła ignoruje zestawy Języka Visual Basic.

Uwaga

Ta reguła została przestarzała. Aby uzyskać więcej informacji, zobacz Przestarzałe reguły.

Opis reguły

Blok catch, który obsługuje Exception przechwytuje wszystkie wyjątki zgodne ze specyfikacją języka wspólnego (CLS). Nie przechwytuje jednak wyjątków niezgodnych ze specyfikacją CLS. Wyjątki niezgodne ze specyfikacją CLS można zgłaszać z kodu natywnego lub z kodu zarządzanego wygenerowanego przez asemblera języka Microsoft Intermediate Language (MSIL). Zwróć uwagę, że kompilatory języka C# i Visual Basic nie zezwalają na zgłaszanie wyjątków niezgodnych ze specyfikacją CLS, a język Visual Basic nie przechwytuje wyjątków niezgodnych ze specyfikacją CLS. Jeśli celem bloku catch jest obsługa wszystkich wyjątków, użyj następującej ogólnej składni bloku catch.

  • C#: catch {}

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

Nieobsługiwany wyjątek niezgodny ze specyfikacją CLS staje się problemem z zabezpieczeniami, gdy wcześniej dozwolone uprawnienia zostaną usunięte w bloku catch. Ponieważ wyjątki niezgodne ze specyfikacją CLS nie są przechwytywane, złośliwa metoda, która zgłasza wyjątek niezgodny ze specyfikacją CLS, może zostać uruchomiona z podwyższonym poziomem uprawnień.

Jak naprawić naruszenia

Aby naprawić naruszenie tej reguły, gdy intencją jest przechwycenie wszystkich wyjątków, zastąp lub dodaj ogólny blok catch lub oznacz zestaw RuntimeCompatibility(WrapNonExceptionThrows = true). Jeśli uprawnienia zostaną usunięte w bloku catch, zduplikuj funkcjonalność w ogólnym bloku catch. Jeśli nie jest to intencja obsługi wszystkich wyjątków, zastąp blok catch, który obsługuje Exception bloki catch obsługujące określone typy wyjątków.

Kiedy pomijać ostrzeżenia

Można bezpiecznie pominąć ostrzeżenie z tej reguły, jeśli blok try nie zawiera żadnych instrukcji, które mogą wygenerować wyjątek niezgodny ze specyfikacją CLS. Ponieważ dowolny kod natywny lub zarządzany może zgłosić wyjątek niezgodny ze specyfikacją CLS, wymaga to znajomości całego kodu, który można wykonać we wszystkich ścieżkach kodu wewnątrz bloku try. Zauważ, że wyjątki niezgodne ze specyfikacją CLS nie są zgłaszane przez środowisko uruchomieniowe języka wspólnego.

Przykład 1

W poniższym przykładzie pokazano klasę MSIL, która zgłasza wyjątek niezgodny ze specyfikacją 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
   }
}

Przykład 2

W poniższym przykładzie przedstawiono metodę zawierającą ogólny blok catch spełniający regułę.

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

Skompiluj poprzednie przykłady w następujący sposób.

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

CA1031: Nie przechwytuj ogólnych typów wyjątków

Zobacz też