Optimierte Fehlerklasse für API-Befehle gegen enaio

Aktuell erhält man bei Fehlern durch den blue-client die komplette Server-API Fehlermeldung zurück (inklusive des kompletten Stacktrace). In Logs etc. macht es das teilweise schwieriger den genauen Fehler zu finden.

Idee wäre eine eigene Fehlerklasse zu erstellen und diese als Result zurück zu geben.

Anbei eine erste Idee mit einfachen String-Operationen. Vielleicht fällt jemanden noch etwas besseres ein. Ich weiß nicht, ob die Klasse immer sauber funktioniert. In Tests lief es jedoch zumindest beim XML-Import.

class EnaioErrorMessage():

    def __init__(self, error_message:str | None) -> None:
        self.full_message: str = error_message if error_message else ''
        self.short_message: str = ''
        self.job_name: str = ''
        self.parameters: Dict = {}
        
        if not error_message:
            return
        
        #splitten bei |.call
        try:
            split_error_message = error_message.split('|.call')
            self.short_message = split_error_message[0].replace('\n\r\n','')
        except:
            self.short_message = error_message

        #weitere Infos
        try:
            additional_infos_zeile = [x for x in split_error_message if x.startswith(' 4 ')]
            if not additional_infos_zeile:
                return

            additional_infos_zeile = additional_infos_zeile[0]
            #Splitten bei szName
            split_sz_name = additional_infos_zeile.split('szName = ')
            self.job_name = split_sz_name[-1].split(';')[0]

            #splitten bei Parameters
            split_param = additional_infos_zeile.split('Parameters = ')
            params = split_param[-1]

            for param in params.split(';'):

                if '=' in param:
                    tmp_split = param.split('=')
                    if tmp_split[0].lower() == 'xml':

                        # Padding hinzufügen, falls nötig
                        base64_str = tmp_split[1]
                        # Berechne, wie viele '=' fehlen
                        padding = len(base64_str) % 4
                        if padding:
                            base64_str += '=' * (4 - padding)
                        # Dekodieren
                        decoded_bytes = base64.b64decode(base64_str)
                        self.parameters[tmp_split[0]] = decoded_bytes.decode('utf-8')

                    else:
                        self.parameters[tmp_split[0]] = tmp_split[1]

        except Exception as e:
            #keinen Fehler werfen, Werte bleiben einfach leer
            pass

Hallo @danielstraub, hallo @uw,

Danke @danielstraub für diese Idee. Die bisherige Implementation kennt eigentlich eine BlueException:

Dort könnte man die Idee einerseits einbauen und die Message kürzen/filtern. Andererseits werfen wir die Exceptions aktuell nicht konsequent als BlueException. Oft geben wir auch nur „nur“ ein Result zurück, welches den Wahrheitswert False hat und die Fehlermeldung beinhaltet etc.

@uw Wie wird sich die kommende Version verhalten, werden allerorts BlueExceptions geworfen?