请看以下代码
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.   

    我在做三层时,想把TClientDataSet的ApplyUpdate方法抛开,因为他的事物处理机制有问题,因此我在服务器端,定义了一个方法如下:
       ApplyUpdates(var CurVar: OleVariant;ProviderName: string);
       begin
         SMDataModule.BeginTrans;  //为ADOConnection.BeginTransction,启动ADO的事物处理
         try
           DoApplyUpdates(CurVar,ProviderName);
           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;请问大家觉得这样做,效果怎样???是好还是坏,不过首先希望大家帮我解决错误捕获的问题,,谢谢了,在线等待
      

  2.   

    你使用了双层异常扑获嵌逃,才导致了着用的后果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;
      

  3.   

    :)欧两年没有摸过delphi了,不知道分析的对不对,不过根据c++,java的异常机制,应该是这个问题!
      

  4.   

    我的ClientDataSet跟DataSetProvider都是动态生成,比如在客户端生成一个ClientDataSet则同时在服务器端生成一个DataSetProvider(相应的也生成了ADOQuery)跟ClientDataSet对应,所以应该不会有并发的问题,下班了,希望大家继续讨论,可以向大家多多学习三层的经验,希望明天看到有更好的回答和想法,谢谢大家了!!!!!
      

  5.   

    问题解决了,我在TDataSetProvider的OnUpdateError事件里,加了这句Raise E;
    不过我认为同样的的在事物处理中也应该加这句Raise E;大家可以讨论,我的上面的做法的效率跟可行性了,错误解决了
      

  6.   

    不执行异常处理的原因到底是什么?
    zhang21cnboy(事了抚衣去,不留身与名) ( 
    你的解释是对的,再进行事物处理的时候把以前的错误抛弃了,所以我再那边加了一句话
      ....
      except
        Rollbacks;
        raisel;
      end;