2015-07-24 2 views
0

Voici l'extrait de la classe I qui hérite de la classe PortableServer :: ServantLocator dans TAO. Lorsque la méthode surchargée de preinvoke() est invoquée, si le serviteur est NULL (ce qui a été détruit avant cette instance), je jette CORBA :: OBJECT_NOT_EXIST() exception en arrière, comme indiqué ci-dessousprocessus SIGABRT lorsque PortableServer :: ServantLocator preinvoke() renvoie 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; 
     } 
    }; 

Mais ce bloque le processus avec le noyau suivant vidage

[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. Pourquoi ne pas la bibliothèque TAO attraper l'exception que je jette? J'ai fait beaucoup de recherches sur Google et je n'ai trouvé aucune solution à cela. Je lance cette exception en référence à l'exemple here. J'ai également essayé de retourner la valeur NULL en espérant que l'exception de pointeur NULL vérifiant la fonction d'appel RequestProcessingStrategyServantLocator :: locate_servant() dans TAO la manipulerait. Même alors, je reçois la même décharge.

  2. L'autre question que j'ai est, pourquoi preinvoke() est appelé en premier lieu par TAO si j'ai déjà détruit le serviteur et retiré sa référence. Quelqu'un peut-il montrer un bon exemple de la façon dont cette référence devrait être supprimée, de sorte que preinvoke() ne serait pas appelé?

EDIT

J'utilise ACE TAO 6.0.7_x86

Comme suggéré dans la réponse de @Johnny Willemsen J'attrapant exception au code client, le lieu où le fonctionnement du serveur est invoqué. Mais ce n'est pas pris ici. le code se bloque toujours.

Mon code client ressemble ci-dessous

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

Répondre

1

Vous êtes très probablement pas attraper l'exception dans votre code client, l'exception est transmis à partir du serveur à votre client. Dans la distribution TAO, voir aussi TAO/tests/On_Demand_Activation pour les tests unitaires de cette fonctionnalité.

+0

Merci pour la réponse @Johnny, j'ai jeté un coup d'oeil à l'exemple, et j'ai essayé de prendre l'exemple en appelant run() d'orb. try { orb-> run(); } catch (Exception CORBA const :: & ex) { Cout << Exception Caught » << endl; return -1;} Mais le processus se bloque toujours au même point que je l'attrapais exception à droite. – vibz

+0

Vous devez ajouter le catch au code client où vous invoquez l'opération sur le serveur –

+0

Johnny, j'ai inclus try catch, l'endroit où le code du serveur est appelé. notifier quand un serviteur a été détruit, de sorte que preinvoke ne sera pas appelé le premier lieu – vibz