当PortableServer::ServantLocator preinvoke()返回CORBA::OBJECT_N



下面是我使用的类的摘录,它继承了TAO中的PortableServer::ServantLocator类。当调用preinvoke()的重写方法时,如果服务为NULL(在此实例之前已被销毁),则抛出CORBA::OBJECT_NOT_EXIST()异常,如下所示

class Locator : public PortableServer::ServantLocator {
    public:
        PortableServer::Servant preinvoke(
                const PortableServer::ObjectId& oid,
                PortableServer::POA_ptr         adapter,
                const char *                    operation,
                Cookie&                         cookie ) throw ()
        {
            .
            .
            .// retrieve servant
            .
            if (servant == NULL) {
                //return NULL;
                throw CORBA::OBJECT_NOT_EXIST ();
            }
            return servant;
        }
    };

但是这会用下面的core dump

使进程崩溃
  [1] __exdbg_notify_of_unexpected(0xfffffc7ffad91640, 0x1, 0xfffffc7ffb849200, 0xfffffc7ffce202e0, 0x18, 0x101010101010101), at 0xfffffc7ffce07f90
  [2] __Crun::ex_chk_unexpected(0x0, 0x0, 0x0, 0x0, 0x0, 0x0), at 0xfffffc7ffce09234
  [3] Locator::preinvoke(this = 0x7c77f0, oid = CLASS, adapter = 0xdcf538, operation = 0xfffffc7ffad92740 "nextData", cookie = (nil)), line 238 in "locator.cpp"
  [4] TAO::Portable_Server::RequestProcessingStrategyServantLocator::locate_servant(0x0, 0x0, 0x0, 0x0, 0x0, 0x0), at 0xfffffc7ffd7521d2
  1. 为什么TAO库不能捕获我抛出的异常?我在谷歌上搜索了很多,但找不到任何解决方案。我抛出这个异常是参考这里的例子。我还尝试返回NULL,希望在TAO中的调用者函数RequestProcessingStrategyServantLocator::locate_servant()中检查NULL指针异常会处理它。

  2. 我的另一个问题是,如果我已经销毁了服务并删除了它的引用,为什么要首先由TAO调用preinvoke() ?有没有人能给我一个很好的例子,说明如何删除this引用,以便不调用preinvoke() ?

编辑

我使用的是ACE TAO 6.0.7_x86

正如在@Johnny Willemsen的回复中所建议的,我在客户端代码中捕获异常,服务器操作被调用的地方。但它不是在这里被抓住的。代码仍然会崩溃。

我的客户端代码如下

      try 
      {
        rs->getValue(tab.out()); 
      }
      catch (CORBA::OBJECT_NOT_EXIST& x) 
      {
          cout << "OMG OMG ERROR: CORBA  : " << x << endl;
      }

您很可能不会在客户端代码中捕获异常,异常从服务器传递回客户端。在TAO发行版中,请参见TAO/tests/On_Demand_Activation以获得此特性的单元测试。

相关内容

  • 没有找到相关文章

最新更新