使用zeep库处理SOAP通信时如何在python中处理错误异常

时间:2019-05-22 13:06:44

标签: python soap zeep

我正在尝试在使用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。

2 个答案:

答案 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 替换为您的错误类型