xpat error in xmlrp client. How to inspect data.

News123 news1234 at free.fr
Tue Mar 30 17:01:40 EDT 2010


Hi Gabriel,

Gabriel Genellina wrote:
> En Thu, 25 Mar 2010 05:31:05 -0300, News123 <news1234 at free.fr> escribió:
> 
>> I'm havign a small xmlrpc client, which works normally fine.
>> (xmlrpc via https)
>>
>> Sometimes however I receive an Exception about an expat error.
>>
>>
>> The output, that I receive is:
>>   File "C:\mycode\myrpcclient.py", line 63, in upload_chunk
>>     rslt = myrpcclient.call()
>>   File "C:\Python26\lib\xmlrpclib.py", line 1199, in __call__
>>     return self.__send(self.__name, args)
>>   File "C:\Python26\lib\xmlrpclib.py", line 1489, in __request
>>     verbose=self.__verbose
>>   File "C:\Python26\lib\xmlrpclib.py", line 1253, in request
>>     return self._parse_response(h.getfile(), sock)
>>   File "C:\Python26\lib\xmlrpclib.py", line 1387, in _parse_response
>>     p.feed(response)
>>   File "C:\Python26\lib\xmlrpclib.py", line 601, in feed
>>     self._parser.Parse(data, 0)
>> ExpatError: syntax error: line 1, column 0
>>
> 
> a) Use the standard cgitb module (despite its name, it is useful outside
> CGI scripts)
> 
> b) Use the tb module available from http://pypi.python.org/pypi/tb
> 
I'm currently using the default module traceback and code, which looks
roughly like:

try:
  xmlrpccall()
except Exception as e:
  ex_type,ex_value,e_b = sys.exc_info()
  tbstring = traceback.format_exc()
  logging.error('%s:%s:%s' % (ex_type,ex_value,tbstring)


do cgitb or tb really provide much more info?


> Both provide a more verbose traceback, including local variables at each
> execution frame.
> 
> c) Replace ("monkey-patch") the feed() method with a more debug-friendly
> version:
> 
> def feed(self, data):
>   try:
>     self._parser.Parse(data, 0)
>   except xmlrpclib.expat.ExpatError, e:
>     e.args += (data,)
>     raise
> 
> xmlrpclib.ExpatParser.feed = feed

Well, the monkey patch seems to be THE solution for my problem. Thanks a
lot.
Now I'll just have to wait till the problem shows up again.
Probably I'll just display the backtrace in the except section.

> 
> (Or perhaps set e.data = data)
> 
> d) In your exception handler, walk the traceback object until you reach
> the feed() call, and inspect the corresponding tb_frame.f_locals
> dictionary.

How can I walk a traceback? For the current problem the the monkeypatch
should be good enough, but for other cases it might be good to know.



bye

N



More information about the Python-list mailing list