以下是我使用的类的摘录,该类继承自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
为什么TAO库没有捕获我抛出的异常?我对此进行了大量的搜索,但找不到任何解决方案。我参考示例here抛出此异常。我还尝试返回NULL,希望TAO中调用方函数RequestProcessingStrategyServantLocator :: locate_servant()的NULL指针异常检查能够处理该异常。即使那样,我也会得到相同的核心转储。
我的另一个问题是,如果我已经销毁了仆人并删除了它的引用,为什么TAO首先要调用preinvoke()。任何人都可以向我展示如何删除此引用的一个好例子,这样就不会调用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,以了解此功能的单元测试。
关于c++ - 当PortableServer::ServantLocator preinvoke()返回CORBA::OBJECT_NOT_EXIST()时,处理SIGABRT,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31608348/