Palestra realizada na Warren para o meetup PoaNETers 17 realizado 25/05/2019. A talk versa sobre o melhor entendimento como funcionam as entranhas de uma exception no dotnet.
Link para palestra no youtube: https://youtu.be/CcMCZXSCo2c
2. Please let me introduce myself
● Desenvolvedor Pleno na Bem Promotora de Vendas
● Futuro Engenheiro da Computação
● Músico hobbysta
● Reviewer olhos de Lince
3. O que é exception?
Segundo o Dicionário priberam exceção é o “Desvio da regra geral”
Segundo o Site significados.com.br: “Exceção significa algo que não é comum, que não faz
parte das regras. A exceção ocorre quando acontece algo fora da regra comum, um fato
inédito, que não era feito ou conhecido antes, e foi aberta uma exceção.”
Segundo a Microsoft: “An exception is any error condition or unexpected behavior that is
encountered by an executing program” (Uma exceção é qualquer condição de erro ou
comportamento inesperado encontrado por um programa em execução)
4. O que é exception?
Segundo o sistema operacional: Uma exception
nada mais é do que uma interrupção de sistema,
mais especificamente uma interrupção de
software
6. O que é interrupção de sistema?
Interrupção de sistema é um sinal emitido ao processador informando que um evento requer
atenção imediata, algo semelhante ao seu chefe dizer para parar a sua tarefa atual para
atender esta nova tarefa urgente (sendo que a anterior também era urgente :) ).
Interrupções de sistema podem ser tanto de hardware quanto software. As interrupções de
hardware são feitas através de sinais eletrônicos (semelhante a uma chave) e rodam de
maneira assíncrona.
7. Interrupções de Software
Interrupções de software podem ser: uma operação ilegal executada pelo processador ou
instruções (“pedaços” de códigos) especiais que ao serem executados geram uma interrupção.
As system calls, códigos para solicitar ao SO o uso de algum hardware, são um tipo de
interrupção.
Exceptions são outro caso de interrupção de sistema.
9. 1. Software executa uma instrução
especial de interrupção de sistema
2. O processador recebe esta instrução
3. O processador para a thread atual
4. O processador salva o contexto da
thread atual
5. O processador busca o handler de
tratamento da interrupção
6. O handler é executado (exception
handler)
7. A thread anterior é restaurada
10. Existem dois tipos básicos de exception: As tratadas pelo CLR e as não tratadas por ele
As tratadas pelo CLR, localizam-se na stack
E as não tratadas pelo CLR, localizam-se no heap e são chamadas de exceptions de código
não gerenciado.
Ambas podem ser capturadas e tratadas pelos blocos try/catch, salvo algumas “exceções” que
não podem ser tratadas e terminam o programa.(Ex: stackoverflow)
E como funciona no caso da Exception?
11. Exception tratadas pelo CRL (Unwinding)
1. Uma operação inválida é gerada
2. O runtime percorre a pilha(stack) buscando o handler de exception correto. Primeiro
lexicamente e em seguida descendo pela call stack (bottom up).
a. Em casos de exception de sistema(fora do .net framework) é buscada o handler de exception
definido por um filter de tratamento SEH
3. Quando o handler correto é encontrado, a stack vai sendo “desenrolado” (unwond) até
aquele ponto
4. No caminho até o ponto de exception
a. todos os objetos locais são destruídos
b. todos os blocos finally são executados
5. Chegando ao originador da exception, ela é acionada
6. O bloco finally é executado
7. A exception é tratada pelo manipulador de exception no código, ou bloqueia a thread
atual. Em casos de stackoverflow a aplicação termina sua execução
12. Exception de código Não Gerenciado
● Se uma exception de tipo nativo do c# ocorre, esta é desempacotada e comparada com
o tipo encontrado. Desta forma o c# pode tratá-lo como se fosse um código
gerenciado(via normal)
● Agora, se houver algum catch do tipo SEHException ou um de seus tipos base antes de
um tipo de exception nativo do c#, o exception do SEH intercepta a exception antes.
Este tipo de exception pode ser tratada de duas formas:
14. Conheça a anatomia da exception
Data Obtém uma coleção chave/valor que proporciona informação adicional defina
pelo usuário sobre àquela exception
Helplink Contém o link para o arquivo associado àquela exception
HResult Código numérico atribuído à exception
InnerException Obtém a Exception que originou a exception atual
Message Descreve a exception atual
Source Contém nome da aplicação ou objeto que causou o erro
StackTrace Obtém a string que representa os frames da call stack
TargetSite Obtém o método que lançou a exception atual
15. Boas práticas ao lidar com exceptions
● Evite exceptions para erros capturáveis antes de “estourar exceptions”
● Try catch cala boca não.
● Ocorreu exception! Podemos tratar e seguir a execução? Se sim, trate, logue e segue o
baile
● Utilize exceptions quando
○ for utilizar I/O
○ lib de terceiros
○ nas suas libs públicas
● Leia este artigo da Microsoft
Explicar como são tratadas as interrupções de software.
Explicar que aqui o objetivo é interrupção de sw
Explicar aqui o que acontece no exception handler
https://docs.microsoft.com/en-us/cpp/dotnet/basic-concepts-in-using-managed-exceptions?view=vs-2019
No caso do SEH, ele busca um filtro exceção, para capturar a exception
SEH: structured exception handler:entender melhor ele(https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.sehexception?redirectedfrom=MSDN&view=netframework-4.8)
lexico: conjunto de palavras que compõem a linguagem
Adicionar a anatomia de uma exception, ou seja, a estrutura do objeto
Adicionar os guidelines da ms e falar sobre exceções tratáveis antes de ocorrer
Utilize exceptions quando for utilizar I/O: comunicação com o banco, comunicação entre apis