Obter número da linha onde é levantada uma exceção

Delphi

22/10/2003

Ola pessoal!
a duvidaé a seguinte ao sabe como pegar linha onde é gerada um excessão?

sera que isso é possivel

eu consigo pegar nome de objetos mas onde e como pego a linha

por exemplo

Edit1.visible:=false;
Edit1.setfocus;// aqui ocorre a ecessão

suponhamos que essa seria a linha 123 como fazer para ele me retornar a linha?

[b:12108f8f02]Título editado pelo Moderador - AZ[/b:12108f8f02]


Macario

Macario

Curtidas 0

Respostas

Aroldo Zanela

Aroldo Zanela

22/10/2003

Colega,

Vc pode obter isso por meio do DEBUG.

Resolvendo o seu problema:

try
  Edit1.visible:=false; 
  if Edit1.CanFocus then Edit1.setfocus;// aqui não ocorre mais a exceção
except
end;



GOSTEI 0
Macario

Macario

22/10/2003

Caro Zanela

Veja só colega revendo meu topico vi que nao fui um tanto claro.


O exemplo que eu quis passar seria, eu tentando passar o foco

a um TEdit (edit1), mas o mesmo se encontra com a propriedade

visible = false, entao nesse momento gera uma excessão.

Agora se possivel como posso obter a linha onde eu seto o foco para o

Tedit

por exemplo


[color=green:2b505b3206]
procedure TForm1.Button1Click(Sender: TObject); begin //lembrando que edit1.visible:=false; Edit1.SetFocus; end;
[/color:2b505b3206]


e digamos que a linha onde esta o [b:2b505b3206][i:2b505b3206]Edit1.setfocus[/i:2b505b3206][/b:2b505b3206], seja de numero 123 na Unit1.paz

espero ter sido mais especifico agora


GOSTEI 0
Beppe

Beppe

22/10/2003

Uma asserção salva a o número da linha:

try
Edit1.SetFocus;
except
Assert(False);
end;

É uma aproximação do verdadeiro erro, já que a linha exibida é do Assert(False).

Ataliba


GOSTEI 0
Macario

Macario

22/10/2003

Valeu Ataliba

Agora outra pergunta teria uma maneira de eu utilizar

essa [b:84c8ac4a13]procedure (Assert)[/b:84c8ac4a13] de uma forma global?

Tipo, uma procedure ou função...na qual, qualquer excessão que ocorra

o Assert me retorne a linha?


Um Abraço a todos


GOSTEI 0
Sistemald

Sistemald

22/10/2003

Procedure Tfrmprincipal.MostraErro(Sender: TObject; E: Exception);
Begin
//tratando alguns erros
if e.Message = ´Invalid input value. Use escape key to abandon changes´ then
begin
showmessage(´Valor invalido. Use o ´Esc´ para abondonar.´);
exit;
end;
if copy(e.Message, 1, 12) = ´SInvalidDate´ then
begin
showmessage(e.Message);
exit;
end;
if copy(e.Message, 1, 18 ) = ´SInvalidFloatValue´ then
begin
showmessage(e.Message);
exit;
end;
if e.Message = ´Não pode criar formulario modal´ then
begin
showmessage(´Não foi possivel abrir o formulario.´);
exit;
end;
//erros não tratados
frmerro.memo.lines.text:=´Erro ocorrido(características técnicas): ´ + #13 + E.Message;
try
frmerro.showmodal;
except
if messagedlg(´Não foi possivel carregas o formulario para tratamento de erro, talvez não seja possivel continuar, para continuar pressione o botão ´Ignorar´, para encerrar o aplicativo pressione o botão ´Abortar´´, mtwarning,
[mbignore, mbabort],0) = mrabort then
application.Terminate;
end;
end;

[b:8f6aaec432]frmerro é um formulario com um memo para demonstrar ao usuario o erro ocorrido[/b:8f6aaec432]

[b:8f6aaec432]Para funcionar[/b:8f6aaec432]
Voce deve colocar no oncreate de todos os form:

Application.OnException:=frmprincipal.MostraErro;

[b:8f6aaec432]Problema[/b:8f6aaec432]

Na Mensagem de erro, não fala em que form ocorreu, nem nada o ideal era implementar este tratamento.


GOSTEI 0
Macario

Macario

22/10/2003

Ola colegas..venho novamente recorrer a ajuda de voces

Com a procedure Assert que o colega Ataliba me passou

consigo obter a Unit e a Linha na qual houve a excessão mas

isso seria muito trabalhoso pois vendo que o sistema no qual trabalho ja é

bem extenso, e para sair aplicando

Try
<intrução>
except
Assert (false)
end;

seria bem trabalhoso.

Entao pergunto como criar uma função ou procedure

que seja colocada no form principal e apartir dele qualquer excessão seja

capturada?

me retornando a linha?


GOSTEI 0
Performance Brasil

Performance Brasil

22/10/2003

Ola colegas..venho novamente recorrer a ajuda de voces

Com a procedure Assert que o colega Ataliba me passou

consigo obter a Unit e a Linha na qual houve a excessão mas

isso seria muito trabalhoso pois vendo que o sistema no qual trabalho ja é

bem extenso, e para sair aplicando

Try
<intrução>
except
Assert (false)
end;

seria bem trabalhoso.

Entao pergunto como criar uma função ou procedure

que seja colocada no form principal e apartir dele qualquer excessão seja

capturada?

me retornando a linha?




Faz o seguinte:

type

TForm1 = class()
procedure AppException(Sender: TObject; E: Exception);
private

public

procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnException := AppException;
end;

procedure TForm1.AppException(Sender: TObject; E: Exception);
begin
Application.ShowException(E);
Application.Terminate;
end;
GOSTEI 0
POSTAR