1、当执行try...except之间的语句序列没有发生异常时,则忽略异常处理部分的语句,程序直接转移try...except..finally后面的语句处执行; 2、Except括起来的语句,则只有在产生异常的情况下会被执行,其他情况一概不执行的。 3、Finally括起来的语句是铁定会被执行的,无论是否有异常产生;
try//尝试执行 {SomeCode} except//出错的时候执行, Except有特定的错误类型 {SomeCode} end;
try//尝试执行 {SomeCode} finally//无论如何都强制执行 {SomeCode} end;
例: try Age:=StrToInt(Edit1.Text); ShowMessage(Format('生于%d年',[YearOf(Now)-Age])); except on EConvertError do showmessage('输入编辑框的不是一个有效的数字!'); on ERangeError do showmessage('输入编辑框的年龄值太大!'); end;
保留字on…do用于判断异常类型。必须注意的是:except后面的语句必须包含在某一个on…do模块中,而不能单独存在。这又是同finally不同的一个地方。
异常处理 try //成功失败都跳进finally语句里执行 finally
end; try //失败才跳进 except里执行 except on e:Exception do ShowMessage(e.Message); end;
例子:我写的一个服务
procedure TDBMonitorService.Timer1Timer(Sender: TObject); var tSQL: string; tSAMPLEID,tJG,tCLASSES,tGUID,tTESTTIME,tC,tSi,tMn,tp,tS,tCu,tNi,tCR,tAS,tSN,tPB,tV,tAL,tTI,tSB,tBI,tMO, tLCH,tLGH,tQX,tSAMPLE,sSCBZ:string; MyArr: array[0..4] of string; i, nFH,j,k:Integer; begin Ansys := true; try //SYN_SIGN=1 已上报 SYN_SIGN=0 未上报 try with qry_erp do begin if Active then Close; SQL.Clear; SQL.Add('SELECT SAMPLEID, SYN_SIGN, nvl(FD_C,0) FD_C, nvl(FD_SI,0) FD_SI, nvl(FD_MN,0) FD_MN, nvl(FD_P,0) FD_P,'); SQL.Add('nvl(FD_S,0) FD_S, nvl(FD_CU,0) FD_CU, nvl(FD_NI,0) FD_NI, nvl(FD_CR,0) FD_CR, nvl(FD_AS,0) FD_AS, nvl(FD_SN,0) FD_SN,'); SQL.Add('nvl(FD_PB,0) FD_PB, nvl(FD_V,0) FD_V, nvl(FD_AL,0) FD_AL, nvl(FD_TI,0) FD_TI, nvl(FD_SB,0) FD_SB, nvl(FD_BI,0) FD_BI, nvl(FD_MO,0) FD_MO, SAMPLEOK, TESTTIME '); SQL.Add('FROM D1_FDSYTS_DATA WHERE SYN_SIGN=0 ORDER BY SENDTIME DESC'); Open; end;
except on e:Exception do begin WriteLog(e.Message+'->数据库打开错误!'); Exit; end; end;
if (not qry_erp.IsEmpty) then begin qry_erp.First; try while not qry_erp.Eof do begin tSQL := ''; sSCBZ:=''; tSAMPLEID := qry_erp.FieldByName('SAMPLEID').AsString; // 炉次号 ,炉罐号 ,去向(9-17-1234,123,A) tSAMPLE :=tSAMPLEID; j:=1; k:=0; for i:=0 to 2 do begin nFH:=pos(',',tSAMPLE); k:=k+nFH; if(nFH<>0) then begin if(j=1) then begin tLCH:=Trim(copy(tSAMPLEID,0,k-1)); end; if(j=2)then begin tLGH:=Trim(copy(tSAMPLE,0,pos(',',tSAMPLE)-1)); tQX:=copy(tSAMPLE,nFH+1,length(tSAMPLE)); end; tSAMPLE:=copy(tSAMPLE,nFH+1,length(tSAMPLE)); j:=j+1; end else if(nFH=0) then break; end;
if(j=3)then begin tC := qry_erp.FieldByName('FD_C').AsString ; tSi := qry_erp.FieldByName('FD_SI').AsString; tMn := qry_erp.FieldByName('FD_MN').AsString; tp := qry_erp.FieldByName('FD_P').AsString; tS := qry_erp.FieldByName('FD_S').AsString; tCu:= qry_erp.FieldByName('FD_CU').AsString; tNi:= qry_erp.FieldByName('FD_NI').AsString; tCR := qry_erp.FieldByName('FD_CR').AsString; tAS := qry_erp.FieldByName('FD_AS').AsString; tSN := qry_erp.FieldByName('FD_SN').AsString; tPB := qry_erp.FieldByName('FD_PB').AsString; tV := qry_erp.FieldByName('FD_V').AsString; tAL:= qry_erp.FieldByName('FD_AL').AsString; tTI:= qry_erp.FieldByName('FD_TI').AsString; tSB:= qry_erp.FieldByName('FD_SB').AsString; tBI:= qry_erp.FieldByName('FD_BI').AsString; tMO:= qry_erp.FieldByName('FD_MO').AsString; tJG:= qry_erp.FieldByName('SAMPLEOK').AsString; tTESTTIME:= qry_erp.FieldByName('TESTTIME').AsString; //铁水化验时间
tCLASSES:='';
MyArr[0]:=''; MyArr[1]:=''; MyArr[2]:=''; MyArr[3]:=''; MyArr[4]:=''; if((tC<>'') and (tSi<>'') and (tS<>'') and (tp<>'') and (tMn<>'') ) then begin if( (StrToFloat(tC)>=3.5) and (StrToFloat(tSi)<=0.8) and (StrToFloat(tS)<=0.05) and (StrToFloat(tp)<=0.17) and (StrToFloat(tMn)<=1)) then begin MyArr[0]:='A'; end; end;
if((tC<>'') and (tSi<>'') and (tS<>'') and (tp<>'') and (tMn<>'') and (tCR<>'') and (tNi<>'') and (tCu<>'') and (tMO<>'') and (tAS<>'')) then begin if( (StrToFloat(tC)>=3.5) and (StrToFloat(tSi)>=0.2) and (StrToFloat(tSi)<=0.6) and (StrToFloat(tS)<=0.05) and (StrToFloat(tp)<=0.14) and
StrToFloat(tMn)<=1) and (StrToFloat(tCR)<=0.10) and (StrToFloat(tNi)<=0.10) and (StrToFloat(tCu)<=0.05) and (StrToFloat(tMO)<=0.05) and (StrToFloat(tAS)<=0.008) ) then begin MyArr[1]:='B'; end; end; if((tC<>'') and (tSi<>'') and (tS<>'') and (tp<>'') and (tMn<>'') and (tCR<>'') and (tNi<>'') and (tCu<>'') and (tMO<>'') and (tAS<>'') and (tPB<>'') and (tSN<>'') and (tSB<>'') and (tBI<>'') and (tTI<>'')) then begin if( (StrToFloat(tC)>=3.5) and (StrToFloat(tSi)>=0.2) and (StrToFloat(tSi)<=0.6) and (StrToFloat(tS)<=0.05) and (StrToFloat(tp)<=0.14) and (StrToFloat(tMn)<=1) and (StrToFloat(tCR)<=0.10) and (StrToFloat(tNi)<=0.10) and (StrToFloat(tCu)<=0.05) and (StrToFloat(tMO)<=0.05) and (StrToFloat(tAS)<=0.008) and (StrToFloat(tPB)<=0.007) and (StrToFloat(tSN)<=0.005) and (StrToFloat(tSB)<=0.005) and (StrToFloat(tBI)<=0.007) and (StrToFloat(tTI)<=0.050) ) then begin MyArr[2]:='C'; end; end; if((tC<>'') and (tSi<>'') and (tS<>'') and (tp<>'') and (tMn<>'') and (tCR<>'') and (tNi<>'') and (tCu<>'') and (tMO<>'') and (tAS<>'') and (tPB<>'') and (tSN<>'') and (tSB<>'') and (tBI<>'') and (tTI<>'')) then begin if( (StrToFloat(tC)>=3.5) and (StrToFloat(tSi)>=0.2) and (StrToFloat(tSi)<=0.6) and (StrToFloat(tS)<=0.05) and (StrToFloat(tp)<=0.14) and (StrToFloat(tMn)<=1) and (StrToFloat(tCR)<=0.05) and (StrToFloat(tNi)<=0.05) and (StrToFloat(tCu)<=0.05) and (StrToFloat(tMO)<=0.05) and (StrToFloat(tAS)<=0.005) and (StrToFloat(tPB)<=0.005) and (StrToFloat(tSN)<=0.003) and (StrToFloat(tSB)<=0.003) and (StrToFloat(tBI)<=0.005) and (StrToFloat(tTI)<=0.050) ) then begin MyArr[3]:='D'; end; end; if((tC<>'') and (tSi<>'') and (tS<>'') and (tp<>'') and (tMn<>'') and (tCR<>'') and (tNi<>'') and (tCu<>'') and (tMO<>'') and (tAS<>'') and (tSN<>'') and (tTI<>'')) then begin if( (StrToFloat(tC)>=3.5) and (StrToFloat(tSi)>=0.2) and (StrToFloat(tSi)<=0.6) and (StrToFloat(tS)<=0.05) and (StrToFloat(tp)<=0.14) and (StrToFloat(tMn)<=1) and (StrToFloat(tCR)<=0.03) and (StrToFloat(tNi)<=0.03) and (StrToFloat(tCu)<=0.03) and (StrToFloat(tMO)<=0.03) and (StrToFloat(tAS)<=0.006) and (StrToFloat(tSN)<=0.007) and (StrToFloat(tTI)<=0.050) ) then begin MyArr[4]:='E'; end; end;
for i:=0 to 4 do begin if MyArr[i] <>'' then tCLASSES:=tCLASSES+ MyArr[i]+','; end; tCLASSES:=copy(tCLASSES,1,length(tCLASSES)-1);
with qry_scyx do begin if Active then Close; SQL.Clear; SQL.Add('SELECT * FROM SJCJ_GLTSHY_TEST where LCH='''+tLCH+''' and LGH='''+tLGH+''' and yxbz=''1'' '); Open; end;
if qry_scyx.IsEmpty then begin tSQL := 'insert into SJCJ_GLTSHY_TEST(BH,LCH,LGH,C,SI,MN,S,P,JG,TSHYJLSJ,V,TI,CR,NI,PB,SN,AS_,SB,BI,MO,CU,CR2,NI2,PB2,SN2,AS_2,SB2,BI2,MO2,CU2,TI2,V2,CLAS SES,yxbz,qx,CJR)' +' values(sys_guid(),'''+tLCH+''','''+tLGH+''','''+tC+''','''+tSi+''','''+tMn+''','''+tS+''','''+tp+''','''+tJG+''',to_date('''+tTESTTIME+''',''yyyy-mm-dd hh24:mi:ss'') ' +' ,'''+tV+''','''+tTI+''','''+tCR+''','''+tNi+''','''+tPB+''','''+tSN+''','''+tAS+''','''+tSB+''','''+tBI+''','''+tMO+''','''+tCu+''' ' +' ,'''+tCR+''','''+tNi+''','''+tPB+''','''+tSN+''','''+tAS+''','''+tSB+''','''+tBI+''','''+tMO+''','''+tCu+''','''+tTI+''','''+tV+''' ,'''+tCLASSES+''',''1'','''+tQX+''',''FDSY'')'; writelog('Insert: '+tSQL); end else begin //如果有数据则更新 tGUID := qry_scyx.FieldByName('BH').AsString; tSQL := ' update SJCJ_GLTSHY_TEST set C='''+tC+''',SI='''+tSi+''',MN='''+tMn+''',S='''+tS+''',P='''+tp+''',JG= '''+tJG+''', TSHYJLSJ=to_date('''+tTESTTIME+''',''yyyy-mm-dd hh24:mi:ss'') ' +' ,V='''+tV+''',TI='''+tTI+''' ,CR='''+tCR+''',NI='''+tNi+''',PB='''+tPB+''',SN='''+tSN+''',AS_='''+tAS+''',SB='''+tSB+''' ' +' ,BI='''+tBI+''',MO='''+tMO+''',CU='''+tCu+''',CR2='''+tCR+''',NI2='''+tNi+''',PB2='''+tPB+''',SN2='''+tSN+''',AS_2='''+tAS+''',SB2='''+tSB+''' ' +' , BI2='''+tBI+''',MO2='''+tMO+''',CU2='''+tCu+''',TI2='''+tTI+''',V2='''+tV+''',CLASSES='''+tCLASSES+''' ' +' where BH='''+tGUID+''' '; writelog('Update: '+tSQL); end; sSCBZ:='1'; end else begin sSCBZ:='2'; end;
if (sSCBZ<>'') then begin try if (tSQL<>'') then begin with qry_scyx do begin if Active then Close; SQL.Text := tSQL; ExecSQL; end; end; except on e:Exception do begin WriteLog('执行oracle语句时:'+e.Message+';SQL语句:'+tSQL); qry_erp.Next; Continue; WriteLog('下一条记录'); end; end; try //更新Accesss qry_erp.Edit; qry_erp.FieldByName('SYN_SIGN').AsString := sSCBZ; //更新已上报标志 except on e:Exception do WriteLog('更新Access上报标志时 : '+e.Message); end; end; qry_erp.Next; end; except on e:Exception do WriteLog('线程执行循环体:'+e.Message); end; end;
finally Ansys := false; end; end;
|
请发表评论