通过 Python XML-RPC 手动引发异常

Manually raising exceptions over Python XML-RPC

答案在本题底部!

在我的情况下,我的客户端将数据发送到服务器以执行 CPU 密集型工作负载。我希望我的 XML-RPC 服务器能够在输入数据出现问题时引发异常。

我在服务器端尝试了一个简单的 raise Exception('description of the error'),但在我的客户端,我得到:xmlrpc.client.Fault: <Fault 1: "<class 'TypeError'>:exceptions must derive from BaseException">

在客户端,我希望能够做到以下几点:

try:
    proxy.processData(data)
except:
    [... code to handle the exception ...]

在服务器端:

def processData(data):
    if 'somethingRequired' not in data:
        raise Exception('Something Required not in data!')
    [... continue processing ...]

我认为在客户端将异常设置为自定义类型可能也是理想的,这样由 XML-RPC 模块引起的异常(例如,无法连接到XML-RPC 服务器)不会被解释为数据输入错误。

谢谢!

更新:解决方案

在我的 processData 方法之上,我添加了以下内容(自定义异常):

class ProcessingError(Exception):
    pass

然后,在我的客户端代码中,我使用以下代码进行错误处理::

try:
    proxy.processData(data)
except xmlrpc.client.Fault as e:
    print(e.faultString)

请注意,如果您想区分自定义异常和来自 XML-RPC 模块的异常(如连接错误),您可以在 except: 块中解析 str(e)检查您的异常是否在错误中。我上面的代码中没有。

xmlrpc.client.Fault class 有一些属性可以找到 here

可能需要在您的情况下引发自定义异常,Exception 正在尝试引用您可能遗漏的父 class。像这样:

class SomeSortOfException(Exception):
   pass

这应该在 processData() 函数的顶部或范围之前。