Tratamento de exceção: diferenças entre revisões

Conteúdo apagado Conteúdo adicionado
Thijs!bot (discussão | contribs)
Linha 19:
Muitas linguagens de programação, como [[Ada (linguagem de programação)|Ada]], [[Object Pascal]], [[C++]], [[D (linguagem de programação)|D]], [[Borland Delphi|Delphi]], [[Eiffel (linguagem de programação)|Eiffel]], [[Java (linguagem de programação)|Java]], [[Objective-C]], [[OCaml]], [[PHP]] (versão 5), [[Python]], [[REALbasic]], [[ML (linguagem de programação)|ML]], [[Ruby (linguagem de programação)|Ruby]], e todas linguagens do ''framework'' [[Microsoft .NET|.NET]] contém suporte nativo para tratamento de exceção. Nestas linguagens, no advento de uma exceção (mais precisamente, uma exceção tratada pela linguagem), a [[pilha de execução]] é varrida até que uma rotina de tratamento de exceção seja encontrada. Isto é, se a função <math>f</math>, que contém uma rotina de tratamento <math>H</math> para a exceção <math>E</math>, chama a função <math>g</math>, que por sua vez chama a função <math>h</math>, e a exceção <math>E</math> ocorre em <math>h</math>, então a função <math>h</math> e <math>g</math> irão terminar em <math>H</math> se <math>f</math> tratar <math>E</math>.
 
Existem apenas alguns poucos estilos de tratamento de exceção em uso, que contém pequenas diferenças entre si. No estilo mais popular, uma exceção é iniciada por uma declaração especial (<code>throw</code> ou <code>raise</code>) com um objeto representando a exceção (como em Java ou Object Pascal, por exemplo) ou um valor de um tipo de enumeração extensível (como em Ada). O escopo de uma rotina de tratamento de exceção é iniciada com uma cláusula de marcação (<code>try</code> ou a palavra reservada da linguagem para início de bloco, como <code>begin</code>), e termina com o início do bloco de tratamento (<code>catch</code>, <code>except</code> ou <code>rescue</code>). Várias cláusulas indicando blocos de tratamento para diferentes tipos de exceções podem ser colocados na seqüênciasequência.
 
Algumas poucas linguagens também permitem o uso da cláusula (<code>else</code>) que é utilizada em caso de exceção ocorrida antes do final do escopo do bloco de tratamento ser alcançado. Mais comum é a utilização da cláusula <code>finally</code> (ou <code>ensure</code>) que é executada independente da ocorrência da exceção, tipicamente para liberar os recursos obtidos no corpo do bloco de tratamento de exceções. A linguagem C++ não possui tal cláusula e, como alternativa, a técnica de [[Resource Acquisition Is Initialization]] pode ser utilizada para liberar os recursos.