Informática Numaboa - Tutoriais e Programação
Assembly - Tratamento de erros
Dom 21 Jun 2009 18:48 |
- Detalhes
- Categoria: Assembly Numaboa (antigo oiciliS)
- Atualização: Domingo, 21 Junho 2009 19:53
- Autor: vovó Vicki
- Acessos: 11604
Moldura de Pilha
Imagine uma função A que chama uma função B que chama uma função C. Cada uma destas funções possui um manipulador de exceções próprio, ou seja, possuem áreas vigiadas. Quando a função A é chamada, o aspecto da pilha é o seguinte:
Endereço de retorno da Função B |
Uso da pilha pela função A ... |
Manipulador de Exceções A |
Dados Locais da Função A |
Endereço de retorno da Função A |
... |
Após a chamada das funções B e C, o aspecto da pilha fica assim:
Uso da pilha pela função C ... |
Manipulador de Exceções C |
Dados Locais da Função C |
Endereço de retorno da Função C |
Uso da pilha pela função B ... |
Manipulador de Exceções B |
Dados Locais da Função B |
Endereço de retorno da Função B |
Uso da pilha pela função A ... |
Manipulador de Exceções A |
Dados Locais da Função A |
Endereço de retorno da Função A |
... |
As molduras de pilha são os endereços da pilha que pertencem a um determinado processo. Caso a função C e a função B sejam encerradas, a moldura da função C e a moldura da função B serão retiradas e a pilha volta a ter o aspecto do primeiro exemplo, onde a moldura da função A volta a ser a moldura do topo da pilha. Este processo é o ALINHAMENTO de pilha.
Se ocorrer uma exceção na área vigiada da função C, o manipulador de exceções C é "engatilhado". Se este manipulador não tratar da exceção, o sistema procura o manipulador B e o "engatilha". Caso este também não trate da exceção, o sistema continua a procura e acha o manipulador A, que também é "engatilhado". Fica claro que o sistema "caminha pilha abaixo", percorrendo a cadeia de manipuladores.
Digamos que o manipulador A trate a exceção. Neste caso ele passa de "engatilhado" para "desarmado". A partir daí, já que o problema foi resolvido, os outros manipuladores também precisam ser "desarmados". O manipulador A se encarrega de "desarmar" todos os manipuladores anteriores a ele. Começa pelo manipulador C, faz o mesmo caminho pilha abaixo e "desarma" toda a cadeia de manipuladores. Este processo chama-se stack unwind, literalmente, "desdobramento da pilha".
Tratamento de Exceções Emolduradas (Frame-based)
Um manipulador de exceções emoldurado é um mecanismo através do qual o programador lida com a possibilidade de que uma exceção possa ocorrer numa determinada sequência de código. Um manipulador de exceções emoldurado é composto pelos seguintes elementos:
- Uma área de código vigiada
- Uma expressão de filtro
- Um bloco de tratamento de exceções
Em linguagens de nível mais alto que o assembly, como o C/C++ por exemplo, os manipuladores de exceções emolduradas são implementados pelas declarações try-except.
A área de código vigiada é constituída por uma ou mais declarações para as quais a expressão de filtro e o bloco de tratamento de exceções fornece proteção. A área de código pode ser um bloco de código, um conjunto de blocos aninhados ou a totalidade de um procedimento ou função.
A expressão de filtro é uma expressão que é avaliada pelo sistema caso ocorra uma exceção na área vigiada. A avaliação resulta em uma das seguintes ações do sistema:
- O sistema interrompe a sua procura por um manipulador de exceções, restaura o estado da máquina e continua a execução do thread no ponto onde a exceção ocorreu.
- O sistema continua procurando um manipulador de exceções.
- O sistema transfere o controle para o manipulador de exceções e a execução do thread continua sequencialmente na moldura de pilha na qual o manipulador foi encontrado. Se o manipulador de exceções não se encontrar na moldura de pilha na qual a exceção ocorreu, o sistema realinha a pilha abandonando a moldura de pilha atual e quaisquer outras molduras até que retorne à moldura de pilha onde se encontra o manipulador de exceções.
O bloco de tratamento das exceções pode ser tão simples quanto apenas anotar o erro e ativar um indicador que será analisado posteriormente ou imprimir uma mensagem de erro ou um aviso. Se a execução continuar, pode ser necessário alterar o estado de máquina modificando o registro de contexto (context record).
Observação da vó
Gostou do assunto? Então, se for do tipo maluco beleza, dê uma lida no tutorial "Lidando com exceções".
- << Anterior
- Próximo