从xmlrpc服务器获取完整的异常信息

我正在调试XMLRPC客户端/服务器应用程序.通常是
服务器中发生异常,我只收到一个非常短的错误
客户在客户端上.例如:
xmlrpclib.fault:<故障1:" :">
大概这是因为服务器上的XMLRPCLIB正在捕获
异常,仅将异常名称发送给客户,而不是
服务器的堆栈跟踪.
我想要的是完全堆栈的痕迹
服务器(即垃圾python通常在
发生异常).我不在乎我在哪一侧看到垃圾场(客户
或服务器),但是我需要查看整个跟踪,以便我可以弄清楚什么
问题是.是否有捷径可寻?
谢谢,
斯科特

# 回答1


斯科特写道:
XMLRPCLIB是客户库.您在这里看到的故障串消息是
由服务器提供.
# 回答2


8月13日,下午3:31,Scott 我也有同样的需求,并且正在复制我在此处使用的代码.请注意
代码比获得完整的堆栈还要多一点
痕迹.要使用它,只需将其复制到文件并使用"服务器"和
来自此模块的" ServerProxy".
谢谢,
拉古
---
'''
此软件包为XMLRPC客户端提供了一个用户包装器
服务器
来自stdlib.主要好处包括:
该服务器提供活着和杀死的功能.更多,任何例外
生成
在RPC函数中,会导致整个堆栈跟踪要发送.
客户端
处理此堆栈跟踪并重新提高例外.
'''
从simplexmlrpcserver导入simplexmlrpcserver
导入XMLRPCLIB
导入系统
导入插座
导入SocketServer
导入追踪
#本课程中的所有公共方法均可被客户调用.
class UtilityFuncs(对象):
def __init __(self, *args,** kwargs):
self.running = true
def杀死(自我):
self.running = false
返回true
Def Alive(自我):
返回true
类服务器(Sumplexmlrpcserver):
def __init __(self, *args,** kwargs):
self.util_inst = utilityFuncs()
simplexmlrpcserver .__ init __(self, *args,** kwargs)
self.register_instance(self.util_inst)
def server_bind(self):
self.socket.setsockopt(socket.sol_socket,socket.so_reuseaddr,
1)
simplexmlrpcserver.server_bind(self)
#默认调度程序不会在整个堆栈中发送
痕迹.
#仅传递类型和值.客户没有办法
会心
#服务器中发生错误的确切位置
一些
#其他手段,例如服务器记录).此调度员发送
所有的
# 堆栈跟踪.
def _dispatch(self,method,params):
尝试:
返回simplexmlrpcserver.__dispatch(self,method,params)
除了:
#无法使用format_exc(),因为它在jython中不可用
但是(甚至
#在中继).
类型,值,tb = sys.exc_info()
提高xmlrpclib.fault(1,
''.join(trackback.format_exception(type,value,tb)))
def serve_until_done(self):
#在螺纹服务器中,kill()可能需要两次调用.
首先,
#时间被称为,循环可能在
新线程 #有机会将其设置为错误.
而self.util_inst.running:
self.handle_request()
类ThreadedServer(socketserver.threadingmixin,服务器):
经过
#仅在客户中指示的特殊例外已定义
这个例外
#实际上源于服务器.
类ServerException(异常):
经过
#服务器将整个堆栈跟踪作为字符串发送.将其转换回

#这里的例外.
类exceptionunmarshaller(xmlrpclib.unmarshaller):
def关闭(自我):
尝试:
返回xmlrpclib.unmarshaller.close(self)
除XMLRPCLIB.FAULT,E:
提高ServerException(E.Faultstring)
类异常TRANSPORT(XMLRPCLIB.TRANSPORT):
xmlrpclib.transport中的#getParser()具有选择最快的逻辑
解析器
# 可用的.解析器需要通过一个未经策略.
很遗憾,
#getParser()不将Unmarshaller作为参数,所以
我们
#不能简单地与我们的Unmarshaller一起称呼它.整体
代码
#需要在这里使用我们的Unmarshaller或我们
利用
#更简单的版本.选择后者(部分是因为
代码是
#受ASPN食谱365244的启发.
def getParser(self):
umarshaller = exceptionunmarshaller()
Parser = xmlrpclib.expatparser(umarshaller)
返回解析器,Unmarshaller
类ServerProxy(XMLRPClib.ServerProxy):
def __init__(self, *args,** kwargs):
#提供我们自己的运输工具
尝试:
Kwargs ['运输']
除了:
#这是预期的
经过
别的:
提高例外('提供了运输(%s).这不是
预期为'
"正在使用自定义运输"%
Kwargs ['transport'])
kwargs ['transport'] = exceptiontransport()
xmlrpclib.serverproxy .__ init __(self, *args,** kwargs)
---

标签: python

添加新评论