zoukankan      html  css  js  c++  java
  • delphi try except语句 和 try finally语句用法以及区别

    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;

  • 相关阅读:
    Tomcat起不来的原因
    Memcache和memcached
    charles
    chrome 和 chromeDriver
    解决Establishing SSL connection without server‘s identity verification is not recommended.
    Shiro的认证与授权
    详解 TCP的三次握手四次挥手
    计算机网络-第三章-数据链路层笔记总结
    阿里云高校计划续用考试凉凉
    用管程解决生产者消费者问题
  • 原文地址:https://www.cnblogs.com/michellexiaoqi/p/6984269.html
Copyright © 2011-2022 走看看