Как обработать исключение ошибки в Python при использовании библиотеки Zeep для обработки сообщений SOAP - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь поймать FaultException при использовании библиотеки Zeep для SOAP-коммуникаций.

Я могу сделать это, когда 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 Exception.

1 Ответ

0 голосов
/ 22 мая 2019

Из документов :

Например, чтобы позволить 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)

PS Я не проверял код "в действии", возможно, некоторыеошибки.

...