我的代码异常处理不起作用,现象是,如果只在出错的那一句前后加上try....except的话,错误就会被捕捉到并处理。但是把整段程序的头尾加上,就不起作用,程序会谈出对话框,并退出....我不知道为什么我的异常处理不起作用....
实际上,并不是错误没有被捕捉,而是程序先弹出错误对话框,之后才能看见错误被我的错误处理捕捉并显示了。我不是在IDE环境下测试的,是编译后。这是一个DLL,在另外一个EXE里面调用下面是代码
procedure ThreadSend.Execute;
var
ID,Deliver_Id,Src_terminal_id,Dest_Terminal_Id,Service_id,Msg_TEXT,misc_linkid: string;
FeeUserType,FeeType,FeeCode,Fee_TerminalId,report,Sr_Level,LT_MORelatetoMTFlag,Phs_SubType,ch_id: string;
src_group,dest_group:string;
DataSize:integer;
myBuffer:pchar;
url,sqlstr:string;begin SendNum:=0;
//***************************************************************************
//!!!!!!!!在这一整段程序的首位,我加入了异常处理,却不起作用。
//***************************************************************************
try
while (not cp_inbox.Eof) do
begin
ID :=cp_inbox.fieldbyname('ID1').AsString;
//Deliver_Id :=cp_inbox.fieldbyname('Deliver_Id').AsString;
Src_terminal_id :=cp_inbox.fieldbyname('Src_terminal_id').AsString;
Dest_Terminal_Id :=cp_inbox.fieldbyname('Destination_Id').AsString;
src_group :=cp_inbox.fieldbyname('src_group').AsString;
//Service_id :=cp_inbox.fieldbyname('Service_id').AsString;
Msg_TEXT :=cp_inbox.fieldbyname('Msg_content').AsString;
misc_linkid :=cp_inbox.fieldbyname('misc_linkid').AsString;
//FeeType :=cp_inbox.fieldbyname('FeeType').AsString;
//FeeCode :=cp_inbox.fieldbyname('FeeCode').AsString;
//Fee_TerminalId :=cp_inbox.fieldbyname('Fee_TerminalId').AsString;
//report :=cp_inbox.fieldbyname('report').AsString;
//Sr_Level :=cp_inbox.fieldbyname('Sr_Level').AsString;
//LT_MORelatetoMTFlag :=cp_inbox.fieldbyname('LT_MORelatetoMTFlag').AsString; URL:=SendYXURL+'?Deliver_Id='+Id+'&Src_terminal_id='+Src_terminal_id+'&Dest_Terminal_Id='+Dest_Terminal_Id;
URL:=URL+'&Msg_TEXT='+Msg_TEXT;
URL:=URL+'&misc_linkid='+misc_linkid+'&src_group='+src_group; WriteRunLog(TempMemo,'指令分析:'+url,TempLog);
WriteLog(fname,'指令分析:'+url,TempLog); try
URL:= TRIM(FRMYX.IdHTTP1.Get(URL));
except
ON E:exception do
begin
WriteRunLog(TempMemo,'处理错误:'+e.Message,TempLog);
WriteLog(logfname(fname,now),'处理错误:'+e.Message,TempLog);
end;
end; WriteRunLog(TempMemo,'业务处理:'+url,TempLog);
WriteLog(fname,'业务处理:'+url,TempLog);
if fetch(url,'^',true)=Id then
begin//***************************************************************************
//!!!!!!注意,这里我就把 URL:= TRIM...这一句前后加上错误处理,就很正常。可以捕捉到错误。但是如果我把这个try.... except去掉,这一句如果出了错,程序却直接就谈出对话框报错了。为什么我放在这一段开头的try不起作用呢???
//***************************************************************************
try
URL:= TRIM(FRMYX.IdHTTP1.Get(fetch(url,'^',true)));
except
ON E:exception do
begin
WriteRunLog(TempMemo,'处理错误:'+e.Message,TempLog);
WriteLog(logfname(fname,now),'处理错误:'+e.Message,TempLog);
end;
end;
if fetch(url,'^',true)=Id then
begin
Deliver_Id :=fetch(url,'^',true);
Src_terminal_id :=fetch(url,'^',true);
Dest_Terminal_Id :=fetch(url,'^',true);
Service_id :=fetch(url,'^',true);
Msg_TEXT :=fetch(url,'^',true);
misc_linkid :=fetch(url,'^',true);
Dest_group :=fetch(url,'^',true);
FeeUserType:=fetch(url,'^',true);
FeeType :=fetch(url,'^',true);
FeeCode :=fetch(url,'^',true);
Fee_TerminalId :=fetch(url,'^',true);
report :=fetch(url,'^',true);
Sr_Level :=fetch(url,'^',true);
LT_MORelatetoMTFlag :=fetch(url,'^',true);
Phs_SubType :=fetch(url,'^',true);
ch_id :=fetch(url,'^',true);
cp_outbox:=TAdoQuery.Create(nil);
cp_outbox.Connection:=DataTcom.ADOCon_Local;
sqlstr:='insert into sdinfo_submit(Deliver_Id,Src_terminal_id,Dest_Terminal_Id,Service_id,Msg_TEXT,misc_linkid,Dest_group,FeeUserType,FeeType,FeeCode,Fee_TerminalId,report,Sr_Level,LT_MORelatetoMTFlag,Phs_SubType,ch_id)';
sqlstr:=sqlstr+'values(''Deliver_Id'',''Src_terminal_id'',''Dest_Terminal_Id'',''Service_id'',''Msg_TEXT'',''misc_linkid'',''Dest_group'',''FeeUserType'',''FeeType'',''FeeCode'',''Fee_TerminalId'',''report'',Sr_Level,LT_MORelatetoMTFlag,Phs_SubType,ch_id)';
cp_outbox.SQL.Add(sqlstr);
cp_outbox.ExecSQL;
cp_inbox.Edit;
cp_inbox.FieldByName('Chang_flag').AsString:='1';
cp_inbox.Post;
WriteRunLog(TempMemo,'处理成功!',TempLog);
WriteLog(logfname(fname,now),'处理成功!',TempLog);
WriteRunLog(TempMemo,'',TempLog);
end
else
begin
cp_inbox.Edit;
cp_inbox.FieldByName('TRY_TIME').AsInteger:= cp_inbox.FieldByName('TRY_TIME').AsInteger+1;
cp_inbox.Post;
WriteRunLog(TempMemo,'处理失败!原因'+(TRIM(URL))+'|次数'+INTTOSTR(cp_inbox.FieldByName('TRY_TIME').AsInteger),TempLog);
WriteLog(logfname(fname,now),'处理失败!原因'+(TRIM(URL))+'|次数'+INTTOSTR(cp_inbox.FieldByName('TRY_TIME').AsInteger),TempLog);
WriteRunLog(TempMemo,'',TempLog);
end;
end
else
begin
cp_inbox.Edit;
cp_inbox.FieldByName('TRY_TIME').AsInteger:= cp_inbox.FieldByName('TRY_TIME').AsInteger+1;
cp_inbox.Post;
WriteRunLog(TempMemo,'分析失败!原因'+(TRIM(URL))+'|次数'+INTTOSTR(cp_inbox.FieldByName('TRY_TIME').AsInteger),TempLog);
WriteLog(logfname(fname,now),'分析失败!原因'+(TRIM(URL))+'|次数'+INTTOSTR(cp_inbox.FieldByName('TRY_TIME').AsInteger),TempLog);
WriteRunLog(TempMemo,'',TempLog);
end; SendNum:=SendNum+1;
cp_inbox.Next;
end;
except
ON E:exception do
begin
FreeMem(myBuffer, DataSize);
cp_inbox.Edit;
cp_inbox.FieldByName('TRY_TIME').AsInteger:= cp_inbox.FieldByName('TRY_TIME').AsInteger+1;
cp_inbox.Post;
WriteRunLog(TempMemo,'过程错误!原因'+e.Message,TempLog);
WriteLog(logfname(fname,now),'过程错误!原因'+e.Message,TempLog);
WriteRunLog(TempMemo,'',TempLog);
e.Free;
cp_inbox.free;
frmYX.sbtn_stop.Click;
frmYX.sbtn_run.Click;
end; end;
end;
end.
实际上,并不是错误没有被捕捉,而是程序先弹出错误对话框,之后才能看见错误被我的错误处理捕捉并显示了。我不是在IDE环境下测试的,是编译后。这是一个DLL,在另外一个EXE里面调用下面是代码
procedure ThreadSend.Execute;
var
ID,Deliver_Id,Src_terminal_id,Dest_Terminal_Id,Service_id,Msg_TEXT,misc_linkid: string;
FeeUserType,FeeType,FeeCode,Fee_TerminalId,report,Sr_Level,LT_MORelatetoMTFlag,Phs_SubType,ch_id: string;
src_group,dest_group:string;
DataSize:integer;
myBuffer:pchar;
url,sqlstr:string;begin SendNum:=0;
//***************************************************************************
//!!!!!!!!在这一整段程序的首位,我加入了异常处理,却不起作用。
//***************************************************************************
try
while (not cp_inbox.Eof) do
begin
ID :=cp_inbox.fieldbyname('ID1').AsString;
//Deliver_Id :=cp_inbox.fieldbyname('Deliver_Id').AsString;
Src_terminal_id :=cp_inbox.fieldbyname('Src_terminal_id').AsString;
Dest_Terminal_Id :=cp_inbox.fieldbyname('Destination_Id').AsString;
src_group :=cp_inbox.fieldbyname('src_group').AsString;
//Service_id :=cp_inbox.fieldbyname('Service_id').AsString;
Msg_TEXT :=cp_inbox.fieldbyname('Msg_content').AsString;
misc_linkid :=cp_inbox.fieldbyname('misc_linkid').AsString;
//FeeType :=cp_inbox.fieldbyname('FeeType').AsString;
//FeeCode :=cp_inbox.fieldbyname('FeeCode').AsString;
//Fee_TerminalId :=cp_inbox.fieldbyname('Fee_TerminalId').AsString;
//report :=cp_inbox.fieldbyname('report').AsString;
//Sr_Level :=cp_inbox.fieldbyname('Sr_Level').AsString;
//LT_MORelatetoMTFlag :=cp_inbox.fieldbyname('LT_MORelatetoMTFlag').AsString; URL:=SendYXURL+'?Deliver_Id='+Id+'&Src_terminal_id='+Src_terminal_id+'&Dest_Terminal_Id='+Dest_Terminal_Id;
URL:=URL+'&Msg_TEXT='+Msg_TEXT;
URL:=URL+'&misc_linkid='+misc_linkid+'&src_group='+src_group; WriteRunLog(TempMemo,'指令分析:'+url,TempLog);
WriteLog(fname,'指令分析:'+url,TempLog); try
URL:= TRIM(FRMYX.IdHTTP1.Get(URL));
except
ON E:exception do
begin
WriteRunLog(TempMemo,'处理错误:'+e.Message,TempLog);
WriteLog(logfname(fname,now),'处理错误:'+e.Message,TempLog);
end;
end; WriteRunLog(TempMemo,'业务处理:'+url,TempLog);
WriteLog(fname,'业务处理:'+url,TempLog);
if fetch(url,'^',true)=Id then
begin//***************************************************************************
//!!!!!!注意,这里我就把 URL:= TRIM...这一句前后加上错误处理,就很正常。可以捕捉到错误。但是如果我把这个try.... except去掉,这一句如果出了错,程序却直接就谈出对话框报错了。为什么我放在这一段开头的try不起作用呢???
//***************************************************************************
try
URL:= TRIM(FRMYX.IdHTTP1.Get(fetch(url,'^',true)));
except
ON E:exception do
begin
WriteRunLog(TempMemo,'处理错误:'+e.Message,TempLog);
WriteLog(logfname(fname,now),'处理错误:'+e.Message,TempLog);
end;
end;
if fetch(url,'^',true)=Id then
begin
Deliver_Id :=fetch(url,'^',true);
Src_terminal_id :=fetch(url,'^',true);
Dest_Terminal_Id :=fetch(url,'^',true);
Service_id :=fetch(url,'^',true);
Msg_TEXT :=fetch(url,'^',true);
misc_linkid :=fetch(url,'^',true);
Dest_group :=fetch(url,'^',true);
FeeUserType:=fetch(url,'^',true);
FeeType :=fetch(url,'^',true);
FeeCode :=fetch(url,'^',true);
Fee_TerminalId :=fetch(url,'^',true);
report :=fetch(url,'^',true);
Sr_Level :=fetch(url,'^',true);
LT_MORelatetoMTFlag :=fetch(url,'^',true);
Phs_SubType :=fetch(url,'^',true);
ch_id :=fetch(url,'^',true);
cp_outbox:=TAdoQuery.Create(nil);
cp_outbox.Connection:=DataTcom.ADOCon_Local;
sqlstr:='insert into sdinfo_submit(Deliver_Id,Src_terminal_id,Dest_Terminal_Id,Service_id,Msg_TEXT,misc_linkid,Dest_group,FeeUserType,FeeType,FeeCode,Fee_TerminalId,report,Sr_Level,LT_MORelatetoMTFlag,Phs_SubType,ch_id)';
sqlstr:=sqlstr+'values(''Deliver_Id'',''Src_terminal_id'',''Dest_Terminal_Id'',''Service_id'',''Msg_TEXT'',''misc_linkid'',''Dest_group'',''FeeUserType'',''FeeType'',''FeeCode'',''Fee_TerminalId'',''report'',Sr_Level,LT_MORelatetoMTFlag,Phs_SubType,ch_id)';
cp_outbox.SQL.Add(sqlstr);
cp_outbox.ExecSQL;
cp_inbox.Edit;
cp_inbox.FieldByName('Chang_flag').AsString:='1';
cp_inbox.Post;
WriteRunLog(TempMemo,'处理成功!',TempLog);
WriteLog(logfname(fname,now),'处理成功!',TempLog);
WriteRunLog(TempMemo,'',TempLog);
end
else
begin
cp_inbox.Edit;
cp_inbox.FieldByName('TRY_TIME').AsInteger:= cp_inbox.FieldByName('TRY_TIME').AsInteger+1;
cp_inbox.Post;
WriteRunLog(TempMemo,'处理失败!原因'+(TRIM(URL))+'|次数'+INTTOSTR(cp_inbox.FieldByName('TRY_TIME').AsInteger),TempLog);
WriteLog(logfname(fname,now),'处理失败!原因'+(TRIM(URL))+'|次数'+INTTOSTR(cp_inbox.FieldByName('TRY_TIME').AsInteger),TempLog);
WriteRunLog(TempMemo,'',TempLog);
end;
end
else
begin
cp_inbox.Edit;
cp_inbox.FieldByName('TRY_TIME').AsInteger:= cp_inbox.FieldByName('TRY_TIME').AsInteger+1;
cp_inbox.Post;
WriteRunLog(TempMemo,'分析失败!原因'+(TRIM(URL))+'|次数'+INTTOSTR(cp_inbox.FieldByName('TRY_TIME').AsInteger),TempLog);
WriteLog(logfname(fname,now),'分析失败!原因'+(TRIM(URL))+'|次数'+INTTOSTR(cp_inbox.FieldByName('TRY_TIME').AsInteger),TempLog);
WriteRunLog(TempMemo,'',TempLog);
end; SendNum:=SendNum+1;
cp_inbox.Next;
end;
except
ON E:exception do
begin
FreeMem(myBuffer, DataSize);
cp_inbox.Edit;
cp_inbox.FieldByName('TRY_TIME').AsInteger:= cp_inbox.FieldByName('TRY_TIME').AsInteger+1;
cp_inbox.Post;
WriteRunLog(TempMemo,'过程错误!原因'+e.Message,TempLog);
WriteLog(logfname(fname,now),'过程错误!原因'+e.Message,TempLog);
WriteRunLog(TempMemo,'',TempLog);
e.Free;
cp_inbox.free;
frmYX.sbtn_stop.Click;
frmYX.sbtn_run.Click;
end; end;
end;
end.
解决方案 »
- 【散分】坑爹的DelphiXE2 与 IOS ..实在是弄不动了
- 哪位朋友推荐个界面不错企业管理系统或者ERP,财务之类的软件学习一下?
- delphi:int或FLOAT类型转换为STRING类型如何让数值一直显示两位小数点。
- 大家給點意見,老大為什麼不讓我在SQL 語句裡面加 CASE 條件和運算?
- 怎么把取到的字符的竖线去掉。
- Service 中使用ADO 不能正常工作............???????????????????????
- ImageList如何放60*60的图标?
- 分组算法求解?
- D6操作WORD2K是不是不太灵光?如何动态设置ADO的路径?
- 多线程里怎么不能传stringlist值呀
- 关于ActiveX,急!
- delhpi好像会自动把消息发送到borland的网站上去,如何屏蔽这些信息
TRIM(FRMYX.IdHTTP1.Get(fetch(url,'^',true)));需跳到另外一个地方的同时,也出错了,且是循环出错,跳不出来了,是不是这个原因