Table of Contents Previous Next
Logo
Server-Side Slice-to-C++ Mapping : 8.6 Raising Exceptions
Copyright © 2003-2009 ZeroC, Inc.

8.6 Raising Exceptions

To throw an exception from an operation implementation, you simply instantiate the exception, initialize it, and throw it. For example:
void
Filesystem::FileI::write(const Filesystem::Lines& text,
                         const Ice::Current&)
{
    // Try to write the file contents here...
    // Assume we are out of space...
    if (error) {
        Filesystem::GenericError e;
        e.reason = "file too large";
        throw e;
    }
};
No memory management issues arise in the presence of exceptions.
Note that the Slice compiler never generates exception specifications for operations, regardless of whether the corresponding Slice operation definition has an exception specification or not. This is deliberate: C++ exception specifications do not add any value and are therefore not used by the Ice C++ mapping. (See [22] for an excellent treatment of the problems associated with C++ exception specifications.)
If you throw an arbitrary C++ exception (such as an int or other unexpected type), the Ice run time catches the exception and then returns an UnknownException to the client. Similarly, if you throw an "impossible" user exception (a user exception that is not listed in the exception specification of the operation), the client receives an UnknownUserException.
If you throw a run-time exception, such as MemoryLimitException, the client receives an UnknownLocalException.1 For that reason, you should never throw system exceptions from operation implementations. If you do, all the client will see is an UnknownLocalException, which does not tell the client anything useful.

1
There are three system exceptions that are not changed to UnknownLocalException when returned to the client: ObjectNotExistException, OperationNotExistException, and FacetNotExistException. We discuss these exceptions in more detail in Section 4.10.4 and Chapter 34.

Table of Contents Previous Next
Logo