1

我正在尝试将任意异常从 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?)

4

1 回答 1

2

您可以从以下位置填充allowed_errors列表__builtins__

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

这将处理常见情况,对于内置异常,如ValueError, TypeError,OSError等。你可能会做一些更高级的事情,比如 PyYAML 和 pickle,它们会自动追踪发送的任何引用异常,但这会让你自己容易受到恶意攻击。

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

于 2010-01-11T23:01:24.740 回答