CA2102: Capturar exceções de não-CLSCompliant 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 de imediatamente seguinte.Esta regra ignora Visual Basic assemblies.
Descrição da regra
Um bloco catch que manipula Exception captura todas as exceções de conformidade com Common Language Specification (CLS).No entanto, ele não capturará as exceções de compatível com não-CLS.Intermediários de não-CLS exceções compatíveis podem ser geradas a partir de código nativo ou gerenciado código que foi gerado pelo Microsoft language (MSIL) montador.Observe que o C# e Visual Basic compiladores não permitem não-CLS compatível com exceções ser lançada e Visual Basic não capturar exceções de 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(...) {} orcatch(Object^) {}
Uma exceção de conformidade não-CLS não tratada se torna um problema de segurança quando 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 uma não-CLS exceção de conformidade 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 em geral bloco catch.Se não for a intenção de lidar com todas as exceções, substitua o bloco catch que manipula Exception com blocos catch que lidam com tipos de exceção específica.
Quando suprimir avisos
É seguro eliminar um aviso esta regra se o bloco try não contém todas as instruções que podem gerar uma exceção de conformidade não-CLS.Porque qualquer código nativo ou gerenciado pode lançar uma não-CLS 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 da seguinte maneira.
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
Exceções e manipulação de exceção (guia de programação do C#)