我正在尝试将任意异常从xmlrpc服务器传递到客户端(这两个python脚本和异常类型都在两侧定义)。在 ActiveState Recipes 它解析返回的“faultstring”,将其与已知异常列表进行比较,如果找到,则引发该异常(而不是将其包装为 xmlrpclib.Fault )
xmlrpclib.Fault
xmlrpc异常响应示例:
<?xml version='1.0'?> <methodResponse> <fault> <value> <struct> <member> <name>faultCode</name> <value> <int>1</int> </value> </member> <member> <name>faultString</name> <value> <string>ValueError:</string> </value> </member> </struct> </value> </fault> </methodResponse>
activestate配方分割“valueerror:”字符串并将“valueerror”与 ValueError.__name__ (在里面) allowed_errors = [ValueError, TypeError] ,请参阅上面的链接)。
ValueError.__name__
allowed_errors = [ValueError, TypeError]
有可能通过吗 全部的 这样的异常,即自动引发任何异常(派生自 Exception 或者其他基类)在客户端(在服务器上引发之后)?
Exception
activestate脚本可以工作,但是我不想注册每个异常 能够 被扔进去 allowed_errors )
allowed_errors
(附加问题:除了xmlrpc之外,还有其他技术可以正确处理这个问题吗?Pyro?)
您可以填充 allowed_errors 列出 __builtins__ :
__builtins__
[exc for exc in __builtins__ if isinstance(exc, BaseException)]
这将处理常见的情况,对于诸如 ValueError , TypeError , OSError 等等,你可能会做一些更高级的事情,比如pyyaml和pickle,它们会自动跟踪任何引用的异常被发送,但这会让你自己面临恶意攻击。
ValueError
TypeError
OSError
如果您希望客户机/服务器的透明性能够自动从客户机上的服务器引发异常,那么pyro可能是比xml-rpc更好的选择。