相关文章推荐
爱健身的作业本  ·  使用 selenium ...·  1 年前    · 
坚韧的充值卡  ·  react-native ...·  1 年前    · 

在使用zeep库处理SOAP通信时,如何在python中处理故障异常?

0 人关注

我试图在使用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>

我想区分一下FaultExceptions和Blind Exceptions。

python
soap
zeep
Srikanth Reddy
Srikanth Reddy
发布于 2019-05-22
2 个回答
Olvin Roght
Olvin Roght
发布于 2021-02-16
已采纳
0 人赞同

From 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()
    root = ET.fromstring(response.text)
    error_text = next(root.iter("faultstring")).text
except:
    error_text = "" 
if error_text:
    raise Fault(error_text)

P.S. 我还没有检查过 "行动 "中的代码,可能有一些错误。

Masoud Aghaei
Masoud Aghaei
发布于 2021-02-16
0 人赞同

在zeep中,你必须手动引发一个自定义的异常,并在xml中保留一个消息。

class Error(Exception):
    """Base class for other exceptions"""
class ERROR_NAME(Error):
    """Raised when the ERROR_NAME"""
    zeep call code...