Tratamento de exceções
Preciso abrir um arquivo texto e ler as linhas desse meu arquivo e somar os valores de cada linha.
Até aí tudo bem, mas acontece que se ocorrerem algumas situações que preciso disparar uma exceção personalizada e não estou conseguindo fazer isso.
Os casos que devo disparar estas exceções são: Se o arquivo informado não existir, disparar a exceção EArquivoNaoEncontrado com a mensagem “Arquivo não encontrado”. Se alguma linha do arquivo estiver vazia, disparar a exceção ELinhaDadosVazia com a mensagem “Linha de dados inválida”. Se ocorrer algum erro de conversão de string para integer, mudar a mensagem da exceção para “Valor alfanumérico encontrado.” Se ocorrer qualquer outra exceção, exibir a mensagem padrão da exceção que ocorreu.
O trecho do meu código está assim:
Como eu faço estas exceções?
Até aí tudo bem, mas acontece que se ocorrerem algumas situações que preciso disparar uma exceção personalizada e não estou conseguindo fazer isso.
Os casos que devo disparar estas exceções são: Se o arquivo informado não existir, disparar a exceção EArquivoNaoEncontrado com a mensagem “Arquivo não encontrado”. Se alguma linha do arquivo estiver vazia, disparar a exceção ELinhaDadosVazia com a mensagem “Linha de dados inválida”. Se ocorrer algum erro de conversão de string para integer, mudar a mensagem da exceção para “Valor alfanumérico encontrado.” Se ocorrer qualquer outra exceção, exibir a mensagem padrão da exceção que ocorreu.
O trecho do meu código está assim:
procedure TTeste.BitBtn1Click(Sender: TObject);
var
arquivo : TextFile;
nome, Linhas : string;
icont : Integer;
Lista: TStringList;
begin
Linhas := '';
icont := 0;
if dlgOpen1.Execute then
begin
try
nome := dlgOpen1.FileName;
if FileExists(nome) then
begin
AssignFile(arquivo,nome);
Reset(arquivo);
while not Eof(arquivo) do
begin
Readln(arquivo,Linhas);
try
icont := icont + StrToInt(Linhas);
except
//aqui devem estar as exceções
end;
end;
end;
finally
CloseFile(arquivo);
end;
end;
end;
Como eu faço estas exceções?
Marcos Gandin
Curtidas 0
Respostas
Marcelo Senaga
19/06/2013
Use raise para lançar uma exceção:
Ver:
http://www.linhadecodigo.com.br/artigo/1258/delphi-tratamento-de-execucoes-robustas.aspx
raise EMathError.Create(‘Erro: EMathError’);// Específico
Ou simplesmente
raise Exception.Create(‘Erro bla: Exception’);// Genérico
Ver:
http://www.linhadecodigo.com.br/artigo/1258/delphi-tratamento-de-execucoes-robustas.aspx
GOSTEI 0
Marcos Gandin
19/06/2013
Certo... mas no meu caso, como que eu faço para identificar que não existe o arquivo ou que tem uma linha em branco no arquivo ou ainda se ele não é um número inteiro?
Tentei colocar todas as exceções uma abaixo da outra no try...except...end mas não deu certo.
Tentei colocar todas as exceções uma abaixo da outra no try...except...end mas não deu certo.
GOSTEI 0
Jaime Junior
19/06/2013
Pode também criar procedures ou functions e chamalás passandos os dados como parametro.
Ex. a que valida o inteiro
//Cria a função de testa se o dados é inteiro
function ValidaInt(dados: String) : boolean;
begin
try
StrToInt(dados);
except
On EConvertError do result := False;
else
result := True;
end;
end;
//No seu comando chama ela se retorna false aparece a mensagem e aborta.
//Exemplo
try
icont := icont + StrToInt(Linhas);
except
//aqui devem estar as exceções
if not(ValidaInt(dados: String)) then//Se for false
begin
showmessagem('Dados não é inteiro!');
abort;//Para a execução do código.
end;
end;
Espero que tenha dado uma ideia para sua solução. abraço
Ex. a que valida o inteiro
//Cria a função de testa se o dados é inteiro
function ValidaInt(dados: String) : boolean;
begin
try
StrToInt(dados);
except
On EConvertError do result := False;
else
result := True;
end;
end;
//No seu comando chama ela se retorna false aparece a mensagem e aborta.
//Exemplo
try
icont := icont + StrToInt(Linhas);
except
//aqui devem estar as exceções
if not(ValidaInt(dados: String)) then//Se for false
begin
showmessagem('Dados não é inteiro!');
abort;//Para a execução do código.
end;
end;
Espero que tenha dado uma ideia para sua solução. abraço
GOSTEI 0
Diego Garcia
19/06/2013
Certo... mas no meu caso, como que eu faço para identificar que não existe o arquivo ou que tem uma linha em branco no arquivo ou ainda se ele não é um número inteiro?
Tentei colocar todas as exceções uma abaixo da outra no try...except...end mas não deu certo.
Tentei colocar todas as exceções uma abaixo da outra no try...except...end mas não deu certo.
Por que você não faz algo mais ou menos assim:
[...]
try
if not FileExists(sCaminhoDoArquivo) then
Raise EArquivoInvalido.Create('Arquivo não encontrado');
[...]
if (sLinhas = EmptyStr) then
Raise ELinhaEmBranco.Create('O arquivo possui uma linha em branco');
except
on e : EConverError do
Raise ENaoEInteiro.Create('Não é um numero válido')
else
raise;
end;
Acredito que você teria que validar etapa por etapa...
GOSTEI 0
Marco Salles
19/06/2013
Certo... mas no meu caso, como que eu faço para identificar que não existe o arquivo ou que tem uma linha em branco no arquivo ou ainda se ele não é um número inteiro?
Tentei colocar todas as exceções uma abaixo da outra no try...except...end mas não deu certo.
Tentei colocar todas as exceções uma abaixo da outra no try...except...end mas não deu certo.
Eu acho que se vc gerar as exceções ( definindo-as ,tal como o autor do Artigo Deve Ter Feito < eu não li >
vai dar Certo sim
type
TerroDisto = class(Exception);
TErroDaquilo = Class (Exception);
e por ai vai..
GOSTEI 0
Marcos Gandin
19/06/2013
Quero agradecer à todos que me ajudaram.
Com certeza as dicas me ajudaram muito.
Tópico Resolvido
Com certeza as dicas me ajudaram muito.
Tópico Resolvido
GOSTEI 0
José
19/06/2013
Quero agradecer à todos que me ajudaram.
Com certeza as dicas me ajudaram muito.
Tópico Resolvido
Com certeza as dicas me ajudaram muito.
Tópico Resolvido
Amigo muito obrigado por seu retorno.
Sendo assim estou dando esse tópico por concluído.
GOSTEI 0