#############################################################################
#
# $Id: errors.py,v 2.19.2.5 2009/12/06 20:26:52 irmen Exp $
# Pyro Exception Types
#
# This is part of "Pyro" - Python Remote Objects
# which is (c) Irmen de Jong - irmen@users.sourceforge.net
#
#############################################################################
#############################################################################
# PyroError is the Pyro exception type which is used for problems WITHIN Pyro.
# User code should NOT use it!!
#
# NOTE: Any exception occuring in the user code on the server will be catched
# and transported to the client, where it is raised just as if it occured
# locally. The occurrence is logged in the server side Pyro log.
# Pyro will use the [Remote]PyroError exceptions and their subtypes to
# indicate that an internal problem occured.
#############################################################################
class PyroError(Exception): pass # internal
class URIError(PyroError): pass # URI probs
class DaemonError(PyroError): pass # daemon probs
class ProtocolError(PyroError): pass # protocol adapter
class ConnectionClosedError(ProtocolError): pass # connection in adapter is closed
class ConnectionDeniedError(ProtocolError): pass # server refused connection
class TimeoutError(ConnectionClosedError): pass # communication timeout
class NamingError(PyroError): pass # name server
class NoModuleError(PyroError): pass # no module found for incoming obj
# do NOT use the following yourself:
class _InternalNoModuleError(PyroError):
def __init__(self, modulename=None, fromlist=None, *args):
# note: called without args on Python 2.5+, args will be set by __setstate__
self.modulename=modulename
self.fromlist=fromlist
PyroError.__init__(* (self,)+args)
def __getstate__(self):
return { "modulename": self.modulename, "fromlist": self.fromlist }
def __setstate__(self, state):
self.modulename=state["modulename"]
self.fromlist=state["fromlist"]
#############################################################################
#
# PyroExceptionCapsule - Exception encapsulation.
#
# This class represents a Pyro exception which can be transported
# across the network, and raised on the other side (by invoking raiseEx).
# NOTE: the 'real' exception class must be 'known' on the other side!
# NOTE2: this class is adapted from exceptions.Exception.
# NOTE3: PyroError IS USED FOR ACTUAL PYRO ERRORS. PyroExceptionCapsule
# IS ONLY TO BE USED TO TRANSPORT AN EXCEPTION ACROSS THE NETWORK.
# NOTE4: It sets a special attribute on the exception that is raised
# (constants.TRACEBACK_ATTRIBUTE), this is the *remote* traceback
# NOTE5: ---> this class is intentionally not subclassed from Exception,
# and also not from object.
# Pyro's exception handling depends on this!
#
#############################################################################
import Pyro.constants
class PyroExceptionCapsule: # don't make this a new style class
def __init__(self,excObj,args=None):
self.excObj = excObj
self.args=args # if specified, this is the remote traceback info
def raiseEx(self):
setattr(self.excObj,Pyro.constants.TRACEBACK_ATTRIBUTE,self.args)
raise self.excObj
def __str__(self):
s=self.excObj.__class__.__name__
if not self.args:
return s
elif len(self.args) == 1:
return s+': '+str(self.args[0])
else:
return s+': '+str(self.args)
def __getitem__(self, i):
return self.args[i]
|