Ниже приводится выдержка из класса, который я использую, который наследуется от класса PortableServer :: ServantLocator в TAO. Когда вызывается переопределенный метод 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;
}
};
Но это сбивает процесс со следующим дампом ядра
[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 не ловит исключение, которое я выбрасываю? Я довольно много гуглял по этому вопросу и не мог найти никакого решения. Я выкидываю это исключение со ссылкой на пример Вот. Я также попытался возвратить NULL, надеясь, что проверка исключений указателя NULL в функции вызывающей стороны RequestProcessingStrategyServantLocator :: locate_servant () в TAO справится с этим. Даже тогда я получаю тот же дамп ядра.
Другой вопрос, который у меня возникает, почему 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 для модульных тестов для этой функции.