Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
22.1 Generalidades
As exceções em C# fornecem uma maneira estruturada, uniforme e segura de tipo de lidar com condições de erro no nível do sistema e no nível do aplicativo.
22.2 Causas das exceções
As exceções podem ser lançadas de duas maneiras diferentes.
- Uma
throwdeclaração (§13.10.6) lança uma exceção imediata e incondicionalmente. O controle nunca chega à declaração imediatamente após othrow. - Certas condições excecionais que surgem durante o processamento de instruções e expressões C# fazem com que uma exceção seja lançada em determinadas circunstâncias, quando a operação não pode ser concluída normalmente. Ver §22.5 para uma lista das várias exceções que podem ser lançadas desta forma.
Exemplo: Uma operação de divisão inteira (§12.12.3) lança um
System.DivideByZeroExceptionse o denominador for zero. Exemplo final
22.3 A classe System.Exception
A System.Exception classe é o tipo base de todas as exceções. Esta classe tem algumas propriedades notáveis que todas as exceções compartilham:
-
Messageé uma propriedade somente leitura do tipostringque contém uma descrição legível por humanos do motivo da exceção. -
InnerExceptioné uma propriedade somente leitura do tipoException. Se o seu valor for não-null, refere-se à exceção que causou a exceção atual. (Ou seja, a exceção atual foi levantada em um bloco de captura que lida com oInnerException.) Caso contrário, seu valor énull, indicando que essa exceção não foi causada por outra exceção. O número de objetos de exceção encadeados dessa maneira pode ser arbitrário.
O valor dessas propriedades pode ser especificado em chamadas para o construtor de instância para System.Exception.
22.4 Como as exceções são tratadas
As exceções são tratadas por uma try declaração (§13.11).
Quando uma exceção é lançada (§22.2), o sistema procura a cláusula catch mais próxima que possa lidar com a exceção, conforme determinado pelo tipo de tempo de execução da exceção. Primeiro, o método atual é pesquisado para uma instrução lexicamente anexa try , e as cláusulas associadas catch da try instrução são consideradas em ordem. Se isso falhar, o método que chamou o método atual é procurado por uma instrução lexicamente anexando try que inclui o ponto da chamada para o método atual. Essa pesquisa continua até que seja encontrada uma catch cláusula que possa manipular a exceção atual, nomeando uma classe de exceção que seja da mesma classe, ou uma classe base, do tipo de tempo de execução da exceção que está sendo lançada. Uma catch cláusula que não nomeia uma classe de exceção pode lidar com qualquer exceção.
Uma vez encontrada uma cláusula correspondente catch , o sistema se prepara para transferir o controle para a primeira instrução da catch cláusula. Antes do início da execução da catch cláusula, o sistema primeiro executa, em ordem, todas as finally cláusulas que foram associadas a try instruções mais aninhadas do que aquela que pegou a exceção.
Se nenhuma cláusula correspondente catch for encontrada:
- Se a busca por uma cláusula correspondente
catchatingir um construtor estático (§15.12) ou inicializador de campo estático, então umSystem.TypeInitializationExceptionserá lançado no ponto que disparou a invocação do construtor estático. A exceção interna doSystem.TypeInitializationExceptioncontém a exceção que foi originalmente lançada. - Caso contrário, se ocorrer uma exceção durante a execução do finalizador e essa exceção não for capturada, o comportamento não será especificado.
- Caso contrário, se a pesquisa por cláusulas correspondentes
catchatingir o código que iniciou inicialmente o thread, a execução do thread será encerrada. O impacto dessa rescisão é definido pela implementação.
22.5 Classes de exceção comuns
As exceções a seguir são lançadas por determinadas operações C#.
| Tipo de exceção | Descrição |
|---|---|
System.ArithmeticException |
Uma classe base para exceções que ocorrem durante operações aritméticas, como System.DivideByZeroException e System.OverflowException. |
System.ArrayTypeMismatchException |
Lançado quando um armazenamento em uma matriz falha porque o tipo do elemento armazenado é incompatível com o tipo da matriz. |
System.DivideByZeroException |
Lançado quando ocorre uma tentativa de dividir um valor integral por zero. |
System.IndexOutOfRangeException |
Lançado quando uma tentativa de indexar uma matriz por meio de um índice que é menor que zero ou fora dos limites da matriz. |
System.InvalidCastException |
Lançado quando uma conversão explícita de um tipo base ou interface para um tipo derivado falha em tempo de execução. |
System.InvalidOperationException |
Lançado quando uma chamada de método é inválida para o estado atual do objeto. |
System.NullReferenceException |
Lançado quando uma null referência é usada de uma forma que faz com que o objeto referenciado seja necessário. |
System.OutOfMemoryException |
Lançado quando uma tentativa de alocar memória (via new) falha. |
System.OverflowException |
Lançado quando uma operação aritmética em um checked contexto transborda. |
System.StackOverflowException |
Lançado quando a pilha de execução está esgotada por ter muitas chamadas pendentes; tipicamente indicativo de recursão muito profunda ou ilimitada. |
System.TypeInitializationException |
Lançado quando um construtor estático ou inicializador de campo estático lança uma exceção, e nenhuma catch cláusula existe para capturá-lo. |
ECMA C# draft specification