Python XMLRPC:在客户端处理任意异常

时间:2010-01-11 21:01:14

标签: python xml-rpc xmlrpclib

我正在尝试将任意异常从XMLRPC服务器传递到客户端(两个Python脚本,双方都定义了异常类型)。在ActiveState Recipes有一个示例客户端实现,它解析返回的“faultString”,将其与已知异常列表进行比较,如果找到,则引发该异常(而不是将其包装在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],参见上面的链接)。

是否可以传递所有这样的异常,即在客户端自动引发任何异常(从Exception或其他一些基类派生)(在它上面引发之后)服务器)?

ActiveState脚本有效,但我不想注册可以抛出的每个异常(必须在allowed_errors中)。

(额外的问题:除了XMLRPC之外还有其他技术可以正确处理这个问题吗?Pyro?)

1 个答案:

答案 0 :(得分:2)

您可以从allowed_errors填充__builtins__列表:

[exc for exc in __builtins__ if isinstance(exc, BaseException)]

这可以处理常见情况,例如ValueErrorTypeErrorOSError等内置异常。你可能会做一些比PyYAML和pickle更先进的事情自动搜索任何引用的异常被发送,但这会让你自己受到恶意攻击。

如果你想要客户端/服务器透明度从客户端服务器上自动引发异常,那么Pyro可能是比XML-RPC更好的选择。