我的代码异常处理不起作用,现象是,如果只在出错的那一句前后加上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.