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

时间:2015-07-24 10:37:44

标签: c++ corba ace tao

以下是我使用的类的摘录,它继承自TAO中的PortableServer :: ServantLocator类。当调用preinvoke()的重写方法时,如果servant是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;
        }
    };

但是这会使用以下核心转储

崩溃该进程
  [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库没有捕获我抛出的异常?我做了很多谷歌搜索,无法找到任何解决方案。我参考示例here抛出此异常。我也尝试返回NULL,希望TAO中调用函数RequestProcessingStrategyServantLocator :: locate_servant()的NULL指针异常检查能够处理它。即使这样,我也会获得相同的核心转储。

  2. 我遇到的另一个问题是,如果我已经销毁了servant并删除了它的引用,为什么TAO首先会调用preinvoke()。任何人都可以向我展示如何删除此引用的一个很好的例子,以便不会调用preinvoke()吗?

  3. 修改

    我正在使用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;
          }
    

1 个答案:

答案 0 :(得分:1)

您很可能无法在客户端代码中捕获异常,异常将从服务器传递回客户端。在TAO发行版中,另请参阅TAO / tests / On_Demand_Activation以获取此功能的单元测试。