Quando usar Exceções
Olá pessoal, ultimamente venho adotando o uso de exceções em minhas aplicações.
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.
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
Curtidas 0
Respostas
Gilvanio Gonçalves
09/10/2012
Caro colega.
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:
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.
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
Marco Salles
09/10/2012
completando , dentro de classe ao inves de showmessage utilize o raise TClasseDeSuaExcecao.create('Sua Mensagem')
vc torna a sua classe mais robusto ...
vc torna a sua classe mais robusto ...
GOSTEI 0
Rafael Costa
09/10/2012
Obrigado Gilvanio e Marco,
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:
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
Marco Salles
09/10/2012
Obrigado Gilvanio e Marco,
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:
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
Alisson Santos
09/10/2012
O uso de exception é de suma importancia para um desenvolvedor, pois com ele você pode verificar o erro que ocorreu após uma certa ação.
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.
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