CA2102: Nicht-CLSCompliant-Ausnahmen in allgemeinen Handlern abfangen
TypeName |
CatchNonClsCompliantExceptionsInGeneralHandlers |
CheckId |
CA2102 |
Kategorie |
Microsoft.Security |
Unterbrechende Änderung |
Nicht unterbrechend |
Ursache
Ein Member in einer Assembly, die nicht mit RuntimeCompatibilityAttribute gekennzeichnet ist bzw. mit RuntimeCompatibility(WrapNonExceptionThrows = false) gekennzeichnet ist, enthält einen catch-Block zur Behandlung von System.Exception und keinen unmittelbar folgenden allgemeinen catch-Block. Diese Regel ignoriert Visual Basic-Assemblys.
Regelbeschreibung
Ein catch-Block, der Exception behandelt, fängt alle CLS (Common Language Specification-)kompatiblen Ausnahmen ab. Nicht CLS-kompatible Ausnahmen werden jedoch nicht abgefangen. Nicht CLS-kompatible Ausnahmen können von systemeigenem Code oder verwaltetem Code ausgelöst werden, der vom MSIL (Microsoft Intermediate Language)-Assembler generiert wird. Beachten Sie, dass der C#- und der Visual Basic-Compiler das Auslösen nicht CLS-kompatibler Ausnahmen nicht gestatten und dass Visual Basic keine nicht CLS-kompatiblen Ausnahmen abfängt. Falls mit dem catch-Block alle Ausnahmen behandelt werden sollen, verwenden Sie die folgende allgemeine Syntax für catch-Blöcke.
C#: catch {}
C++: catch(...) {} oder catch(Object^) {}
Eine unbehandelte nicht CLS-kompatible Ausnahme wird zu einem Sicherheitsrisiko, wenn früher zulässige Berechtigungen aus dem catch-Block entfernt werden. Da nicht CLS-kompatible Ausnahmen nicht abgefangen werden, könnte eine böswillige Methode, die eine nicht CLS-kompatible Ausnahme auslöst, mit erhöhten Berechtigungen ausgeführt werden.
Behandeln von Verstößen
Um einen Verstoß gegen diese Regel zu beheben, während der Zweck darin besteht, alle Ausnahmen abzufangen, ersetzen oder fügen Sie einen allgemeinen catch-Block hinzu oder markieren die Assembly als RuntimeCompatibility(WrapNonExceptionThrows = true). Wenn Berechtigungen im catch-Block entfernt werden, duplizieren Sie die Funktionalität im allgemeinen catch-Block. Falls der Zweck nicht darin besteht, alle Ausnahmen zu behandeln, ersetzen Sie den catch-Block, durch den Exception behandelt wird, durch catch-Blöcke zur Behandlung spezifischer Ausnahmetypen.
Wann sollten Warnungen unterdrückt werden?
Eine Warnung dieser Regel kann gefahrlos unterdrückt werden, wenn der try-Block keine Anweisungen enthält, durch die eine nicht CLS-kompatible Ausnahme generiert werden könnte. Da eine nicht CLS-kompatible Ausnahme durch beliebigen systemeigenen oder verwalteten Code ausgelöst werden kann, ist hier die grundlegende Kenntnis sämtlichen Codes erforderlich, der in allen Codepfaden innerhalb des try-Blocks ausgeführt werden kann. Beachten Sie, dass nicht CLS-kompatible Ausnahmen nicht von der Common Language Runtime ausgelöst werden.
Beispiel
Im folgenden Beispiel wird eine MSIL-Klasse veranschaulicht, die eine nicht CLS-kompatible Ausnahme auslöst.
.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
}
}
Im folgenden Beispiel wird eine Methode veranschaulicht, die einen allgemeinen catch-Block enthält, der die Regel erfüllt.
// 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();
}
}
}
Kompilieren Sie die vorherigen Beispiele wie folgt.
ilasm /dll ThrowNonClsCompliantException.il
csc /r:ThrowNonClsCompliantException.dll CatchNonClsCompliantException.cs
Verwandte Regeln
CA1031: Allgemeine Ausnahmetypen nicht auffangen
Siehe auch
Referenz
Ausnahmen und Ausnahmebehandlung (C#-Programmierhandbuch)