通过 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()
函数的顶部或范围之前。
答案在本题底部!
在我的情况下,我的客户端将数据发送到服务器以执行 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()
函数的顶部或范围之前。