Come devo gestire i codici di errore da un'API XML esterna?

1

Problema

Ho una libreria Python che invia richieste XML a un'API esterna. Se si verifica un problema, l'API risponde con un errore contenente un codice di errore e una descrizione con dettagli di errore.

Questi errori possono essere causati da dati XML malformati, nome utente / password non validi, modifica di un attributo di sola lettura o tentativo di caricare dati che non esistono.

<Response Status="Failure" Action="LoadByName">
    <Error Message="WFP-00235 The job name does not exist in the database." ErrorCode="17" AtIndex="0"/>
</Response>

Approccio attuale

Poiché non riesco a controllare la risposta che riceverò, la mia libreria gestisce attualmente eventuali eccezioni sollevando un RuntimeError con il messaggio ricevuto dall'API.

import xml.etree.ElementTree as ElementTree

def parse_response(xml):
    # Check if XML response contains any errors
    if xml.find(".//Error") is not None:
        raise RuntimeError(xml.find(".//Error").get("Message"))
    ...

RuntimeError: WFP-00235 The job name does not exist in the database.

Uno dei principali difetti con questo approccio è che ErrorCode non viene conservata quando viene sollevata un'eccezione. Ciò rende impossibile rilevare errori API specifici, poiché ogni errore è essenzialmente un'eccezione generica .

Domanda

Come devo gestire gli errori XML che provengono da un'API esterna? Posso aumentare / catturare errori in base al loro numero di errore numerico?

    
posta Steven M. Vascellaro 01.02.2018 - 18:24
fonte

2 risposte

4

Suggerirei di evitare l'uso di un'eccezione generale in questo caso. Il generale "qualcosa è successo", le eccezioni di tipo vanno bene per situazioni in cui non c'è nulla di ragionevole che tu possa fare al riguardo.

In questo caso sembra che ti interessi dei vari errori. Il modo più semplice per farlo è creare un unico tipo di eccezione che possa contenere tutti i dati di errore.

class UhOhError(Exception):
  def __init__(self, message, errorcode, errordata):
    super(UhOhError, self).__init__(message)
    self.errorcode = errorcode
    self.errordata = errordata

Quindi hai accesso a quei campi ovunque tu voglia prenderlo. Se si conoscono tutti i seguenti errori e si devono intraprendere azioni diverse a seconda dei vari problemi, è possibile che siano disponibili vari tipi di eccezione. Ciò semplifica la gestione delle eccezioni perché dichiari quali errori vuoi catturare in varie posizioni semplicemente la clausola except .

Puoi persino fare entrambe le cose, un unico tipo di eccezione per la maggior parte delle cose e un tipo specifico per i problemi che devi individuare e trattare in modo diverso.

    
risposta data 01.02.2018 - 18:48
fonte
1

Stai iniziando dal lato sbagliato. Non dovresti chiedere "dovrei lanciare un RuntimeError, o cos'altro dovrei fare". Dovresti chiedere "cosa dovrebbe fare la mia applicazione se si verifica l'errore X".

In genere categorizzo errori come questo: ci sono errori in cui la tua app può risolvere il problema. Ad esempio uno status 300 (reindirizzamento) in cui dovresti sapere come risolverlo. In tal caso, risolvi il problema.

Ci sono errori in cui l'utente può risolvere il problema (e probabilmente vuole risolvere il problema). In tal caso, comunichi all'utente e aiutali il più possibile a risolvere il problema. La situazione tipica non è la connessione WiFi - questo è un problema che l'utente può risolvere.

Quindi ci sono degli errori che potrebbero risolverli da soli se riprovi più tardi. A seconda della situazione, l'app riproverà un po 'più tardi, solo per conto proprio, o avviserà l'utente, e eventualmente riproverà più tardi. Ad esempio, un timeout probabilmente significa che un server è inattivo, e ci dovrebbe essere qualcuno in giro come un matto che risolve il problema per te, e in seguito funzionerà.

Poi ci sono errori che indicano che hai fatto un errore usando l'API. Ciò accadrebbe molto durante lo sviluppo, se dovesse accadere nella produzione, non si può fare molto altro che dire all'utente e arrendersi.

E ci sono tutti gli errori in cui non hai idea di come gestirli. Non c'è niente per farlo funzionare, quindi puoi solo segnalare questi errori e fallire delicatamente.

    
risposta data 24.04.2018 - 21:43
fonte

Leggi altre domande sui tag