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

1 投票
1 回答
1599 浏览
提问于 2025-04-15 17:54

我正在尝试从一个 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 个回答

2

你可以从 __builtins__ 中获取 allowed_errors 列表:

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

这样做可以处理一些常见的错误,比如 ValueError(值错误)、TypeError(类型错误)、OSError(操作系统错误)等等。你也可以尝试一些更高级的方式,比如使用 PyYAML 和 pickle,这些方法可以自动找到被引用的异常,但这样做可能会让你的程序更容易受到恶意攻击。

如果你想要那种客户端和服务器之间透明的效果,也就是服务器上的异常能自动在客户端抛出,那么 Pyro 可能比 XML-RPC 更适合你。

撰写回答