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)

Ilasm. exe (Assembler MSIL)

Conceitos

Substituindo as verificações de segurança

CLS (Common Language Specification)