5

Tôi có mã máy chủ xmlrpc đơn giản:Cách xem traceback trên máy chủ xmlrpc, không phải máy khách?

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() 

Phiên mẫu.

Chủ đầu tư:

>>> 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"> 
>>> 

Server:

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

Câu hỏi đặt ra là nếu tôi có thể nhận được dấu vết này lại cũng trên máy chủ. Tôi cần phải biết nếu có vấn đề gì xảy ra với truy vấn xử lý. Tôi không sử dụng ứng dụng khách được viết bằng Python nên rất khó để tôi có được traceback như trên.

+0

Câu hỏi của bạn là thực sự khó hiểu. Bạn nói rằng bạn không sử dụng một khách hàng trong python, nhưng khách hàng của bạn là mã python. – Falmarri

+0

Có, nhưng đó chỉ là ví dụ. Là khách hàng tôi đang sử dụng một số dll mà dựa trên thư viện xmlrpc-c. Và tôi thực sự không muốn thay đổi mã của dll này ... – Adam

Trả lời

9

Bạn có thể làm một cái gì đó như thế này: phía máy chủ

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() 

Traceback:

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 
+1

Cảm ơn! Nó sẽ là giải pháp tốt cho tôi. – Adam

+0

Điều này sẽ tiết kiệm cho tôi những ngày đầu đập. Cảm ơn. – Jamie