[Twisted-Python] Pass error (exception) message to XMLRPC client
Remy Cool
mailinglists at smartology.nl
Thu Apr 28 08:34:26 MDT 2005
Jp Calderone wrote:
> On Thu, 28 Apr 2005 10:59:57 +0200, Remy Cool
> <mailinglists at smartology.nl> wrote:
>
>> Brett Viren wrote:
>>
>>> Remy C Cool <remy.cool at smartology.nl> writes:
>>>
>>>> Hello,
>>>>
>>>> I've searched on the (Twisted) website and mailinglists, but failed to
>>>> find the answer to my question.
>>>>
>>>> Is is possible to pass the original exception code/message to the
>>>> XMLRPC client? When an exception occurs, the client get's a general
>>>> 'error occured' message and I would like to be able to let the client
>>>> know what went wrong. How can I accomplish this with Twisted?
>>>
>>>
>>>
>>> It isn't really an exception but I use the idiom of returning an
>>> (int,string) tuple:
>>>
>>> (err,error_message)
>>>
>>> If err != 0, it's interpreted as an error code. A successful return
>>> is (0,"").
>>>
>>> I don't happen to do it, but I suppose you could then raise an
>>> exception on the client size by hand when non-zero is returned.
>>
>>
>> That's one way to process exceptions, but that's not what I want. You
>> will need to catch all exceptions yourself and send back a tupple as you
>> described above. XMLRPC support exception handling, and I would like to
>> use that mechanism rather then coding my own solution.
>>
>> If an exception occurs in the backend (XMLRPC server) the client
>> receives an XMLRPC error (created by Twisted?). My question was and is,
>> if it is possible to send the 'real' exception message to the client in
>> place of the general message it now receives.
>>
>
> The behavior of that Fault is defined the _ebRender method of
> twisted.web.client.xmlrpc.XMLRPC. Presently it is defined as:
>
> def _ebRender(self, failure):
> if isinstance(failure.value, Fault):
> return failure.value
> log.err(failure)
> return Fault(self.FAILURE, "error")
>
> Which logs complete error information on the server and sends minimal
> information to the client. If you override this method, you can cause
> more information to be sent to the client. It probably avoids doing
> this currently in case the string version of the failure contains
> sensitive information.
>
> Note that _ebRender is private and so may change at any time. You
> should be prepared to deal with this, or override the render() method
> itself and set up your own errback, or contribute a patch that adds a
> public API for handling all unexpected errors in code invoked from an
> XMLRPC resource.
Thanks for your reply, I'll look into it.
-- Remy --
More information about the Twisted-Python
mailing list