请看以下代码
try
    if not VarIsNull(CustVar) then
      CustVar := DataSetProvider1.ApplyUpdates(CustVar,0,ErrCount);
  except
    //showmessage('Error');
    on E: Exception do
      raise Exception.Create(HandleError(E));//SmDataModule.GetErrorInfo(E));
 end;此段代码用TDataSetProvider的ApplyUpdate方法来进行数据的更新,可是如果输入的数据错误,导致数据库报错,我用try..except截获它,并且将此错误抛出,由客户端截获此错误,并显示,可无论我怎样输错数据except...之中的代码就不执行,但是我调试时程序执行到这一段  Custvar := DataSetProvider.ApplyUpdate()就报错,不知道为什么?
请高手帮忙解决;
注:
  function HandleError(E);的代码如下
  if  not (E is EDBEngineError) then
  begin
    ADOErrors := ADOConnection.Errors;
    for i := 0 to ADOErrors.Count - 1 do
    begin
      ADOError := ADOErrors.Item[i];
      Result := ADOError.Description;
    end;
  end;
为截获ADO的错误,因为我的DataSetProvider的DataSet为ADO。
上面的错误跟HandleError无关,主要的问题是明明有错误发生Except中的代码却不执行>??????下面我会将我的整个程序的处理过程跟大家解释一下,我不想在DataSetProvider的OnUpdateError里写东西。

解决方案 »

  1.   

    你使用了双层异常扑获嵌逃,才导致了着用的后果ApplyUpdates(var CurVar: OleVariant;ProviderName: string);
       begin
         SMDataModule.BeginTrans;  //为ADOConnection.BeginTransction,启动ADO的事物处理
         try
           DoApplyUpdates(CurVar,ProviderName);  //注意这个地方可能发生异常,在这个地方发生异常以后,将会终止此调用中所有动作,而转到except去执行。也就是,当你的 doapplyUpdates函数中发生异常之后,doapplyupdates函数的所有动作都被终止,那么里面的except当然不被执行!你可以把except修改为finally尝试一下!
        SmDataModule.CommitTrans;
         except
           SmDataModule.RollTrans;
         end; 
      end;
      DoApplyUpdate代码如下:
      begin
        try
          if not VarIsNull(CustVar) then
          begin
            CustVar := DsProvider.ApplyUpdates(CustVar,0,ErrCount);
            if ErrCount > 0 then
              SysUtils.Abort;
          end;
        except
          on E: exception do
             raise Exception.Create(SmDataModule.GetErrorInfo(E));//抛出异常,由客户端调用ApplyUpdate时,可以截获
        end;  
      end;
      SmDataModule.GetErrorInfo(E)代码如下:  //为截获ADO的错误,
     var
      ADOErrors: Errors;
      ADOError: Error;
      i: integer;
    begin
      if  not (E is EDBEngineError) then
      begin
        ADOErrors := ADOConnection.Errors;
        for i := 0 to ADOErrors.Count - 1 do
        begin
          ADOError := ADOErrors.Item[i];
          Result := ADOError.Description;
        end;
      end;
    end;