清看 http://expert.csdn.net/Expert/topic/1923/1923077.xml?temp=.4006769

解决方案 »

  1.   

    SOrder:begin
      ……
      try
        upstk.method1(orderID,updatestock_s.UPDATE_OUTSTOCK);
      except
        on e:eoleexception do logtofile(e.message);
        raise;     //  在这里重新抛出异常,  客户端能够捕获
      end;
    end;IErrorInfo 等处理错误的接口已经被封装到 Delphi 的 safecall 异常处理中了,不用你自己实现。
      

  2.   

    跟 http://expert.csdn.net/Expert/topic/1926/1926924.xml?temp=.5555689 中的内容DataModule 事务支持是设到 require a transaction 以上吧, 还是 support transaction 然后动态起动了事务?事怪之处就在这了, 在 transaction 中的异常(用SetAbort结束后)被调用者得到就是"灾难性错误", 重新理解了 SetAbort 和 SetComplete 后, 觉得这两句是说调用后对像释放, ?函数结束?, DisableCommit 和 EnableCommit 是说事务失败, ?函数还要操作?, 对像不释放, 总之很含糊, 还在理解ing & 试验ing那句 SetAbort 和 SetComplete 用 DisableCommit 和 EnableCommit 代替就可以把异常回传可能也会有问题, 主要问题就是对像有没有被释放了? 事务Context会不会自动释放其中对像(好像是会)目前我的理解是: 在一个事务体中的所有的对像释放都应由事务决定, 因为在事务没决定前事务中对像是要有状态的, 这里记录了事务中的改动过程
      

  3.   

    连事务中的异常都有这么些学问?晕ing
      

  4.   

    To comanche(太可怕):我怎么没遇到你说的问题呢?我试了一下,事务支持设到 require a transaction 以上, 或者 support transaction 然后动态起动了事务,都不会出现你所说的情况。只要把 raise 放在 SetAbort 之后就行!
      

  5.   

    我在触发器里抛出个异常.
    但我的客户端只显示 ole error 80040e14 
    谁来说说这么回事?调用顺序:
      client->更新对象->业务组件->数据库调试时在业务组件能捉到.在更新对象捉不到.
    业务组件那层抛出异常在客户端是可以收到.
    为什么在数据库发出就不行呢?
      

  6.   

    是的, 在客户机就得到 灾难性失败 or 服务器发生异常在事务对像(更新)中用 EnableCommit 和 DisableCommit 代替 SetComplete 和 SetAbort 会正确, 对像是否会释放正在关心中