Python XMLRPC:クライアント側での任意の例外を処理します
質問
XMLRPCサーバーからクライアントに任意の例外を渡そうとしています(両方のPythonスクリプト、例外タイプは両側で定義されています)。模範的なクライアント側の実装があります レシピを活性化します 返された「フォールトストリング」を解析し、それを既知の例外のリストと比較し、見つかった場合、その例外を提起します(それを包む代わりに 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]
, 、cf。上記のリンク)。
合格することは可能ですか? 全て このような例外、IEは自動的に例外を提起します(から派生した Exception
またはクライアント側の他の基本クラス)(サーバーで上げられた後)?
ActiveStateスクリプトは機能しますが、すべての例外を登録したくありません できる 投げられます(入る必要があります allowed_errors
).
(ボーナス質問:この問題を適切に処理できるXMLRPC以外の別のテクノロジーはありますか?Pyro?)
解決
あなたはに入力できます allowed_errors
からのリスト __builtins__
:
[exc for exc in __builtins__ if isinstance(exc, BaseException)]
これは、組み込みの例外のために、一般的なケースを処理します ValueError
, TypeError
, OSError
, など。おそらく、PyyamlやPickleのように、より高度なことをすることができます。そこでは、参照される例外が送信されるものはすべて自動的に追い詰められますが、これにより悪意のある攻撃が開かれます。
クライアントのサーバーから例外を自動的に引き上げるクライアント/サーバーの透明性の種類が必要な場合、PyroはおそらくXML-RPCよりも良い選択です。