CA2102: Catch não CLSCompliant exceções nos manipuladores gerais
TypeName |
CatchNonClsCompliantExceptionsInGeneralHandlers |
CheckId |
CA2102 |
<strong>Categoria</strong> |
Microsoft.Security |
Alteração significativa |
Não-separável |
Causa
Um membro em um assembly que não está marcado com o RuntimeCompatibilityAttribute ou está marcado como RuntimeCompatibility(WrapNonExceptionThrows = false) contém um bloco catch que manipula System.Exception e não contém um bloco catch geral imediatamente seguinte. Esta regra ignora Visual Basic assemblies.
Descrição da regra
Um bloco catch que manipula Exception captura todas as especificações CLS (Common Language) compatível com exceções. No entanto, ele não capturar exceções de conformidade não-CLS. Não-CLS compatível com exceções podem ser geradas a partir de código nativo ou gerenciado código que foi gerado pelo Microsoft intermediário language (MSIL) montador. Observe que C# e Visual Basic compiladores não permitem não-CLS compatível com exceções sejam geradas e Visual Basic não capturar exceções em conformidade não-CLS. Se a intenção de bloco catch manipular todas as exceções, use a seguinte sintaxe de bloco catch geral.
C#: catch {}
C++: catch(...) {}oucatch(Object^) {}
Uma exceção de conformidade não-CLS não tratada torna-se um problema de segurança quando as permissões concedidas anteriormente são removidas no bloco catch. Porque as exceções de conformidade não-CLS não são detectadas, um método de mal-intencionado que lança compatível com exceção de não-CLS foi executado com permissões elevadas.
Como corrigir violações
Para corrigir uma violação desta regra quando o objetivo é capturar todas as exceções, substituir ou adicionar um bloco catch geral ou marcar o assembly RuntimeCompatibility(WrapNonExceptionThrows = true). Se as permissões forem removidas no bloco catch, duplicar a funcionalidade geral bloco catch. Se não for a intenção de se tratar de todas as exceções, substitua o bloco catch que manipula Exception com catch bloqueia que tipos de exceção específica de identificador.
Quando suprimir avisos
É seguro eliminar um aviso esta regra se o bloco try não contém quaisquer instruções que podem gerar uma exceção de conformidade não-CLS. Porque qualquer código nativo ou gerenciado pode lançar, não-CLS, com exceção de conformidade, isso requer conhecimento de todos os códigos que podem ser executados em todos os caminhos de código no bloco try. Observe que as exceções de conformidade não-CLS não são lançadas pelo common language runtime.
Exemplo
O exemplo a seguir mostra uma classe MSIL que lança uma exceção de conformidade não-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
}
}
O exemplo a seguir mostra um método que contém um bloco catch geral que satisfaça a regra.
// 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();
}
}
}
Compile os exemplos anteriores, como segue.
ilasm /dll ThrowNonClsCompliantException.il
csc /r:ThrowNonClsCompliantException.dll CatchNonClsCompliantException.cs
Regras relacionadas
CA1031: Não capturar os tipos de exceção geral
Consulte também
Referência
Exceptions and Exception Handling (C# Programming Guide)