Python XMLRPC: 客户端如何处理任意异常
我正在尝试从一个 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 个回答
你可以从 __builtins__
中获取 allowed_errors
列表:
[exc for exc in __builtins__ if isinstance(exc, BaseException)]
这样做可以处理一些常见的错误,比如 ValueError
(值错误)、TypeError
(类型错误)、OSError
(操作系统错误)等等。你也可以尝试一些更高级的方式,比如使用 PyYAML 和 pickle,这些方法可以自动找到被引用的异常,但这样做可能会让你的程序更容易受到恶意攻击。
如果你想要那种客户端和服务器之间透明的效果,也就是服务器上的异常能自动在客户端抛出,那么 Pyro 可能比 XML-RPC 更适合你。