Fórum Quando usar Exceções #425812
09/10/2012
0
Porém, sempre tenho uma dúvida, quando devo usar exceções?
Por exemplo, estou criando uma classe onde tenho uma procedure excluir. Ai sempre fico na dúvida, o que é melhor,
criar uma procedure que lance uma exceção caso ocorra algum erro durante a exclusão ou trocar a procedure por uma function e retornar apenas true e false?
Ou seja, não sei bem quando devo utilizar exceções.
Desde já, Obrigado.
Rafael Costa
Curtir tópico
+ 0Posts
09/10/2012
Gilvanio Gonçalves
com as exceções é que tratamos os erros que aparecem na execução
de trarefas em nossas aplicações. Uma exceção acontece quando
algo deu errado, ou seja, quando não aconteceu aquilo que
era esperado, então neste momento o Delphi executa a exceção
que poderá resolver ou não, desde que, é claro, seu código
tenha sido programado para isso, no lugar de mostrar aquela
mensagem indesejável ao usuário.
A principal finalidade de usarmos o tratamento de exceções em nossas aplicações
em Delphi é torná-lo mais robusto por meio de manipulação
de erros. As exceções permitem que o código de tratamento
e erros de seu código normal sejam separados, o que torna
seu código final mais compacto e simples de enteder. Uma outra
vantagem em usar execeções é que elas definem um mecanismo
de relato de um erro uniforme que também é usado pelo componentes
do Delphi.
As exceções
se baseiam em quatro blocos especiais:
Try, que indica o início de um
bloco de comandos protegidos;
Except, que delimita o final
de um bloco de comandos protegidos e põe os códigos de tratamento
de exceção;
Finally, que é usado para especificar
os blocos de comandos que sempre serão executados independente
do resultado;
Raise, que é a instrução usada
para gerar uma exceção.
um exemplo basico de uso de excessão:
function
Dividir(X, Y: integer): integer; begin try
Result := X div Y; except on EDivByZero
do begin
Result := 0;
ShowMessage(‘Erro! Divisor igual a zero.
Divisão inválida!);
end;
end;
end;Neste exemplo se o valor de Y for igual a zero, a função
retornará um zero ao invéz de interromper o programa apenas
com um erro.
Nessa instrução o Tratamento de Exceção, foi pego a exceção EDivByZero
que é intena do Delphi. O Delphi define uma hierarquia de
exceções e você pode optar por manipular cada tipo de exceção
de forma diferente ou agrupa-las em conjuntos.
é isto!.
Espero ter exclarecido.
Gostei + 0
09/10/2012
Marco Salles
vc torna a sua classe mais robusto ...
Gostei + 0
09/10/2012
Rafael Costa
pelo que entendi então, vou partir do principio que sempre que minha execução sair do fluxo principal eu irei lançar uma exceção deixando a responsabilidade de tratá-la a quem estiver utilizando a classe.
Algo semelhante a este exemplo:
procedure TConsulta.ExcluirProcedimento(ipCodigo:integer);
var
vaDataSet: TSQLDataSet;
begin
vaDataSet := CriarDataSet;
try
vaDataSet.CommandText := 'delete from consulta where consulta.codigo= :CODIGO';
vaDataSet.ParamByName('CODIGO').AsInteger := ipCodigo;
if vaDataSet.ExecSQL() < 1 then//se entrar é pq saiu do fluxo principal, pois execSQL deveria retornar 1
raise Exception.Create('Erro ao excluir a consulta');
finally
vaDataSet.Close;
vaDataSet.Free;
end;
end;
Gostei + 0
09/10/2012
Marco Salles
pelo que entendi então, vou partir do principio que sempre que minha execução sair do fluxo principal eu irei lançar uma exceção deixando a responsabilidade de tratá-la a quem estiver utilizando a classe.
Algo semelhante a este exemplo:
sim e vc ainda pode definir uma exceção especifica para a sua classe e ainda especifica para o erro
è so vc definir uma excecao que descenda da classe excpetion
type
TMinhaExcecaoDoErroTal = class Exception
const
cMensagemParaErroTal = 'Minha Mensagem Para este Tipo de erro';
na hora de lança o Raise faça
raise TMinhaExcecaoDoErroTal.Create(cMensagemParaErroTal);
Gostei + 0
09/10/2012
Alisson Santos
O ideal é como está fazendo na sua classe ter o tratamento para deixar tudo centralizado.
Mas vale lembrar que quando faz o uso de um dos componentes da dbexpress geralmente alguns erros são silenciosos sendo necessário você fazer no provider para poder capturar o erro.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)