代码之家  ›  专栏  ›  技术社区  ›  AndiDog

python xmlrpc:在客户端处理任意异常

  •  1
  • AndiDog  · 技术社区  · 15 年前

    我正在尝试将任意异常从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 回复  |  直到 15 年前
        1
  •  2
  •   LeafStorm    15 年前

    您可以填充 allowed_errors 列出 __builtins__ :

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

    这将处理常见的情况,对于诸如 ValueError , TypeError , OSError 等等,你可能会做一些更高级的事情,比如pyyaml和pickle,它们会自动跟踪任何引用的异常被发送,但这会让你自己面临恶意攻击。

    如果您希望客户机/服务器的透明性能够自动从客户机上的服务器引发异常,那么pyro可能是比xml-rpc更好的选择。

    推荐文章