我正在尝试在使用zeep库进行SOAP通信时捕获FaultException。
当zeep librabry从客户端接收xml并在内部进行解析并默认返回字典时,我能够执行此操作。解析包含FaultException的响应时,出现以下错误。
符合预期
Traceback (most recent call last):
File "zeep_test_emulator.py", line 83, in <module>
raise zeep_exceptions.Fault(faultexe.message)
zeep.exceptions.Fault: Forename contains invalid characters
但是当我在客户端设置中启用raw_response = True时,zeep库将不会解析xml,而是仅返回xml响应。现在,如果响应中包含FaultException,我将无法捕获FaultException,因为我不知道如何从响应中引发FaultException。这是下面的回复。
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<soap:Fault>
<faultcode>soap:Client</faultcode>
<faultstring>Forename contains invalid characters</faultstring>
<faultactor>https://ct.abcd.co.uk/services.asmx</faultactor>
<detail />
</soap:Fault>
</soap:Body>
</soap:Envelope>
我想区分FaultException和Blind Exception。
答案 0 :(得分:0)
来自docs:
例如,让zeep 直接返回原始响应,而不是进行处理 ...
...
# response is now a regular requests.Response object
因此,如果您希望lib跳过对响应的处理,则应手动进行。这意味着您需要解析来自xml的错误消息并手动引发错误(当然,如果您要处理异常)
import xml.etree.ElementTree as ET
from zeep.exceptions import Fault
...
response = client.service.myoperation()
try:
root = ET.fromstring(response.text)
error_text = next(root.iter("faultstring")).text
except:
error_text = ""
if error_text:
raise Fault(error_text)
P.S。我没有检查代码“运行中”,可能是一些错误。
答案 1 :(得分:0)
在 zeep 中,您必须手动引发自定义异常并在 xml 中删除一条消息。
例如
class Error(Exception):
"""Base class for other exceptions"""
pass
class ERROR_NAME(Error):
"""Raised when the ERROR_NAME"""
pass
try:
zeep call code...
except ERROR_NAME:
print('STH')
将 ERROR_NAME
替换为您的错误类型