Table of Contents Previous Next
Logo
Server-Side Slice-to-Python Mapping : 20.6 Raising Exceptions
Copyright © 2003-2008 ZeroC, Inc.

20.6 Raising Exceptions

To throw an exception from an operation implementation, you simply instantiate the exception, initialize it, and throw it. For example:
class FileI(Filesystem.File):
    # ...

    def write(self, text, current=None):
        # Try to write the file contents here...
        # Assume we are out of space...
        if error:
            e = Filesystem.GenericError()
            e.reason = "file too large"
            raise e
The mapping for exceptions (see Section 18.9) generates a constructor that accepts values for data members, so we can simplify this example by changing our raise statement to the following:
class FileI(Filesystem.File):
    # ...

    def write(self, text, current=None):
        # Try to write the file contents here...
        # Assume we are out of space...
        if error:
            raise Filesystem.GenericError("file too large")
 
If you throw an arbitrary Python run-time exception, 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 an Ice run-time exception, such 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 run-time exceptions that are not changed to UnknownLocalException when returned to the client: ObjectNotExistException, OperationNotExistException, and FacetNotExistException. We discuss these exceptions in more detail in Chapter 30.

Table of Contents Previous Next
Logo