【问题标题】:Python XMLRPC: Handling arbitrary exceptions on client-sidePython XMLRPC:在客户端处理任意异常
【发布时间】:2010-01-11 21:01:14
【问题描述】:

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

【问题讨论】:

    标签: python xml-rpc xmlrpclib


    【解决方案1】:

    您可以从__builtins__ 填充allowed_errors 列表:

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

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

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

    【讨论】:

    • 我认为第一个建议行不通,因为我有很多自定义异常类型。也许我会在接下来的几天里试用 Pyro。
    猜你喜欢
    • 2015-08-18
    • 1970-01-01
    • 2019-07-27
    • 2015-04-26
    • 1970-01-01
    • 2017-04-08
    • 2019-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多