Archived
This forum has been archived. Please start a new discussion on GitHub.
A question about Exception hierarchy in Ice
in Help Center
If an operation implementation raises a run-time exception other than
ObjectNotExistException, FacetNotExistException, or
OperationNotExistException (such as a NotRegisteredException), the
client receives an UnknownLocalException. In other words, the Ice protocol
does not transmit the exact exception that was encountered in the server, but
simply returns a bit to the client in the reply to indicate that the server encountered
a run-time exception.
Suppose an operation throws an CompressionNotSupportedException on the server side, then the client will get an UnknownLocalException and know nothing about CompressionNotSupportedException.
My suggestion:
Since every exception has an unique name(eg. CompressionNotSupportedException's name is "Ice::CompressionNotSupportedException"), it's better that if we can transfer this information to the client. It needs little change to Ice:
//Exception.cpp
class ICE_UTIL_API Exception
{
//...
public:
void ice_setRealName(const char* realName)
{
_realName = realName;
}
char * ice_getRealName()
{
return _realName;
}
private:
const char* _realName;
};
//Incoming.cpp
before we replace CompressionNotSupportedException(ex_1) with UnknownLocalException(ex_2), we can do like this:
ex_2.ice_realName(ex_1.ice_name());
//Client.cpp
//...
try
{
thePrx->theOperation(...);
}
catch {const UnknownLocalException& ex)
{
cout << "The exception " << ex.ice_getRealName() << " is caught" << endl;
}
//...
0
Comments
-
If you take a closer look at the definition of Ice::UnknownException (in Ice-2.1.1/slice/Ice/LocalException.ice), we actually transfer the stringified representation of the exception in the "unknown" field.
Benoit.0 -
Great
, Thank you! 0