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(...) {}
lubcatch(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
Powiązane reguły
CA1031: Nie przechwytuj ogólnych typów wyjątków
Zobacz też
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla