CA2102: Przechwytuj wyjątki inne niż CLSCompliant w ogólnej obsłudze wyjątków
TypeName |
CatchNonClsCompliantExceptionsInGeneralHandlers |
CheckId |
CA2102 |
Kategoria |
Microsoft.Security |
Zmiana kluczowa |
Niekluczowa |
Przyczyna
Element członkowski w zestawie, który nie jest oznaczony atrybutem RuntimeCompatibilityAttribute lub jest oznaczony RuntimeCompatibility(WrapNonExceptionThrows = false) zawiera blok catch, który obsługuje Exception i nie zawiera bezpośrednio następującego, ogólnego bloku catch.Ta reguła ignoruje zestawy Visual Basic.
Opis reguły
Blok catch, który obsługuje Exception przechwytuje wszystkie wyjątki zgodne z Common Language Specification (CLS).Jednakże nie przechwytuje wyjątków, które nie są zgodne z CLS.Wyjątki nie zgodne z CLS mogą być zgłaszane przez kod natywny lub kod zarządzany, który był wygenerowany przez assembler języka Microsoft Intermediate Language (MSIL)Warto zauważyć, że kompilatory C# i Visual Basic nie pozwalają na zgłoszenie wyjątków niezgodnych z CLS a Visual Basic nie przechwytuje wyjątków nie zgodnych z CLS.Jeśli blok catch ma za zadanie obsługiwać wszystkie wyjątki, należy użyć następującej składni ogólnego bloku catch.
C#: catch {}
C++: catch(...) {} lub catch(Object^) {}
Nieobsługiwane wyjątki, które nie są zgodne z CLS stają się problemem z zabezpieczeniami, kiedy wcześniej przyznane uprawnienia zostaną usunięte w bloku catch.Ponieważ wyjątki niezgodne z CLS nie są przechwytywane, złośliwa metoda, która zgłasza wyjątek niezgodny z CLS może działać bez posiadania uprawnień.
Jak naprawić naruszenia
Aby naprawić naruszenie tej reguły, kiedy zamiarem jest przechwytywanie wszystkich wyjątków, zastąp lub dodaj ogólny blok catch lub oznacz zestaw jako RuntimeCompatibility(WrapNonExceptionThrows = true).Usunięcie uprawnień w bloku catch duplikuje funkcjonalność ogólnego bloku catch.Jeśli nie jest zamiarem obsługiwać wszystkie wyjątki, należy zamienić blok catch, który obsługuje Exception na bloki catch, obsługujące określone typy wyjątków.
Kiedy pominąć ostrzeżenia
Bezpiecznie jest pomijać ostrzeżenia dotyczące tej reguły, jeśli blok try nie zawiera żadnych instrukcji, które mogą generować wyjątki niezgodne z CLS.Ponieważ dowolny kod natywny lub zarządzany może zgłosić wyjątek niezgodny z CLS, to wymaga wiedzy o całości kodu, który może być wykonany we wszystkich ścieżkach kodu wewnątrz bloku try.Należy zauważyć, że wyjątki niezgodne z CLS nie są generowane przez środowisko uruchomieniowe języka wspólnego.
Przykład
Poniższy przykład pokazuje klasę MSIL, która zgłasza wyjątek niezgodny z 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
}
}
Poniższy przykład pokazuje metodę, która zawiera ogólny blok catch, który spełnia tą 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();
}
}
}
Należy skompilować poprzednie przykłady jak następuje.
ilasm /dll ThrowNonClsCompliantException.il
csc /r:ThrowNonClsCompliantException.dll CatchNonClsCompliantException.cs
Powiązane reguły
CA1031: Nie przechwytuj wyjątków typów ogólnych
Zobacz też
Informacje
Wyjątki i obsługa wyjątków (Przewodnik programowania w języku C#)