Tratamento de Excees try objetivo tratar erros de
Tratamento de Exceções (try) • objetivo tratar erros de software ou hardware • como separando o código de tratamento de erros do código normal da aplicação • Em tempo de execução, o Delphi levanta exceções quando alguma coisa sai errada e o código da aplicação, se escrito adequadamente, poderá solucionar. • Exceção é um objeto que contém informações sobre o erro ocorrido e onde ocorreu.
define se a execução do programa deverá parar ou não quando o Delphi levantar uma exceção
Todo mecanismo de tratamento de exceções é baseado em quatro palavras-chave: try delimita o começo de um bloco de código protegido except delimita o fim de um bloco de código protegido e introduz as instruções de tratamento de exceções, com a sintaxe: on tipo-exceção 1 do instrução 1; on tipo-exceção 2 do instrução 2; . . . [ else {código padrão de tratamento de erros }; ] finally é usada para especificar blocos de código limpo que devem ser executados sempre, mesmo quando ocorrerem exceções (liberar recursos) raise para é a instrução usada para gerar uma exceção (pode ser usada dentro de um manipulador para relevantar uma exceção, isto é, propagá-la para o próximo manipulador)
{ Esta função representa um exemplo simples de bloco de código protegido. Na instrução de manipulação de exceção, é capturada a exceção EDiv. By. Zero, que se refere a um problema de divisão por zero, detectado em tempo de execução (Run-Time Error) e que é levantada pelo Delphi. } function Divide(A, B: integer): integer; begin try { tratando erro de divisão por zero } Result : = A div B; except on EDiv. By. Zero do Result : = 0; end;
Exceções da RTL (1/4) • RTL- Run-Time Library, biblioteca de run-time • As exceções geradas pela RTL são definidas em Arquivos de Programas - Borland - Delphi 6 Source - Rtl - Sys (Sys. Utils, Sys. Const), e todas descendem da classe mais geral Exception, que provê a string que aparece na janela.
Exceções da RTL (2/4) • Exceções de Entrada e Saída – acessar arquivos ou dispositivos de entrada e saída – EIn. Out. Error, o atributo Error. Code indica o erro ocorrido • Exceções de Memória Heap (EHeap. Exception) – alocar ou acessar memória dinâmica – EOutof. Memory, não há memória suficiente – EInvalid. Pointer, ponteiro inválido
Exceções da RTL (3/4) • Exceções Matemáticas para Inteiros (EInt. Error) – EDiv. By. Zero, divisão por zero – ERange. Error, número fora do limite – EInt. Overflow, estouro na operação com inteiro • Exceções de Ponto Flutuante (EMath. Error) – – EInvalid. Op, operação inválida EOverflow, estouro na operação com reais EUnderflow, estouro na operação com reais EZero. Divide, divisão por zero
Exceções da RTL (4/4) • Exceções de Type. Cast – atribuir um objeto a um tipo incompatível usando o operador as – Um. Objeto as Tipo. Objeto, gera a exceção se Um. Objeto é de um tipo incompatível com o Tipo. Objeto – EInvalid. Cast • Exceções de Conversão – converter dados de um tipo para outro – EConvert. Error
Hierarquia das Exceções tipos de exceções: TObject EDiv. By. Zero ERange. Error EInt. Overflow Exception EExternal EInt. Error EMath. Error EInvalid. Op EOverflow EUnderflow EZero. Divide
Outras Exceções Importantes • EVariant. Error, erro em operação com variant • EAbort, exceção silenciosa, pode ser gerada pelo procedimento Abort e não mostra nenhuma mensagem • EAccess. Violation, acesso inválido à memória, geralmente ocorre com objetos não inicializados • EDatabase. Error, erro genérico de banco de dados • EDBEngine. Error, descende de EDatabase. Error e traz dados que podem identificar o erro
Códigos de Erro da BDE (BDE. int, pasta Doc do Delphi) DBIERR_KEYVIOL 9729 violação de chave primária DBIERR_LOCKED registro travado DBIERR_FILELOCKED arquivo travado DBIERR_LOOKUPTABLEERR erro em tabela Lookup DBIERR_DETAILTABLESEXIST 9734 há registros na tabela detalhe violando, portanto, a integridade do relacionamento
Programadores também podem definir suas próprias exceções; simplesmente criando uma nova subclasse da exceção padrão: type EArray. Full = class(Exception); Quando for acrescentado um novo elemento a um array que já está cheio (provavelmente por causa de um erro de lógica do programa), é possível lançar a exceção correspondente criando um objeto desta classe: if My. Array. Full then raise EArray. Full. Create(‘Array Full’); Este método Create (herdado da classe Exception) tem um parâmetro de string para descrever a exceção para o usuário. Nota: não é necessário destruir o objeto que criou a exceção, pois ele será excluído automaticamente pelo mecanismo de tratamento de exceções.
{ Este trecho de programa levanta a exceção criada por: raise EArray. Full. Create(‘Array Full’); } begin. . . try { operação qualquer sobre o array que irá levantar a exceção: EArray. Full } except on EArray. Full do { trata a exceção de array cheio }; end; . . . end;
Objeto de Exceção try. . . except { O objeto E da Classe Exception recebe o valor do objeto exceção levantado (generalizar a exceção). } on E: Exception do begin Result : = 0; Message. Dll(E. Message, mt. Error, [mb. OK], 0); end; Nota: quando o Delphi levanta uma exceção um objeto exceção é criado indicando seu tipo para tratamento através da cláusula on.
Protegendo o código e tratando a exceção levantada Código desprotegido, descrição da exceção levantada é apresentada ao usuário Código desprotegido, sendo que a exceção levantada e apresentada ao usuário, foi criada com a instrução raise
Referência • Dominando o Delphi 4 - A Bíblia – Marco Cantú – MAKRON Books, 1999 – Capítulo 3 - Programação Orientada a Objetos em Delphi – pg. 104. . 109
- Slides: 19