如何在xmlrpc服务器上查看回溯,而不是客户端?

问题描述:

我有简单的XML-RPC服务器代码:如何在xmlrpc服务器上查看回溯,而不是客户端?

from SimpleXMLRPCServer import SimpleXMLRPCServer 

port = 9999 

def func(): 
    print 'Hi!' 
    print x # error! 
    print 'Bye!' 

if __name__ == '__main__': 
    server = SimpleXMLRPCServer(("localhost", port)) 
    print "Listening on port %s..." % port 
    server.register_function(func) 
    server.serve_forever() 

简单的会话。

客户:

>>> import xmlrpclib 
>>> p = xmlrpclib.ServerProxy('http://localhost:9999') 
>>> p.func() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    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 1392, in _parse_response 
    return u.close() 
    File "C:\Python26\lib\xmlrpclib.py", line 838, in close 
    raise Fault(**self._stack[0]) 
xmlrpclib.Fault: <Fault 1: "<type 'exceptions.NameError'>:global name 'x' is not defined"> 
>>> 

服务器:

Listening on port 9999... 
Hi! 
localhost - - [11/Jan/2011 16:17:09] "POST /RPC2 HTTP/1.0" 200 - 

的问题是,如果我能得到这个追溯也在服务器。我需要知道处理查询是否出错。我没有使用用Python编写的客户端,因此我很难像上面那样获得回溯。

+0

你的问题实在令人困惑。你说你没有在Python中使用客户端,但你的客户端是Python代码。 – Falmarri 2011-01-11 16:02:24

+0

是的,但这仅仅是一个例子。作为客户端,我使用了一些基于xmlrpc-c库的dll。我真的不想改变这个DLL的代码... – Adam 2011-01-11 16:18:02

你可以做这样的事情:

from SimpleXMLRPCServer import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler 

port = 9999 

def func(): 
    print 'Hi!' 
    print x # error! 
    print 'Bye!' 

class Handler(SimpleXMLRPCRequestHandler): 
    def _dispatch(self, method, params): 
     try: 
      return self.server.funcs[method](*params) 
     except: 
      import traceback 
      traceback.print_exc() 
      raise 


if __name__ == '__main__': 
    server = SimpleXMLRPCServer(("localhost", port), Handler) 
    server.register_function(func) 
    print "Listening on port %s..." % port 
    server.serve_forever() 

回溯服务器端:

Listening on port 9999... 
Hi! 
Traceback (most recent call last): 
    File "xml.py", line 13, in _dispatch 
    value = self.server.funcs[method](*params) 
    File "xml.py", line 7, in func 
    print x # error! 
NameError: global name 'x' is not defined 
localhost - - [11/Jan/2011 17:13:16] "POST /RPC2 HTTP/1.0" 200