2017-07-12 13 views
0

Ich führe eine PyQt5 UI, die IP-Adressen durch REST APIs hinzufügt. Beim Senden von Operationen an meinen Worker Thread (führt einige for loops aus und führt einige Funktionen innerhalb dieser Schleifen aus), wird immer dann, wenn eine Ausnahme innerhalb des Codes ausgelöst wird, der genaue Fehler nicht von json.loads ausgegeben.PyQt5 Urllib löscht Ausgabe

Mein Hauptziel ist es, genau den err.read() des 4xx oder 5xx Fehler zu erhalten, um den Benutzer zu informieren, was genau passiert ist (die 4xx und 5xx Fehler werden ausgegeben, nur nicht die json.loads (err.read()).)

def patch_object_group (f): 
    self.api_path = "/api/objects/networkobjectgroups/EXT-SFTPALLOWED/" 
    self.req = urllib.request.Request(str(server) + self.api_path, json.dumps(self.patch_data_group).encode('utf-8'), headers, method="PATCH") #Default Method is Post 
    self.base64string = base64.encodestring(('%s:%s' % (username,password)).encode()).decode().replace('\n', '') 
    self.req.add_header("Authorization", "Basic %s" % self.base64string) 
    try: 
     f = urllib.request.urlopen(self.req)#Had to add .request between the url for python 3. 
     self.status_code = f.getcode() 
     # print("Status code is {}.".format(self.status_code)) 
     if self.status_code == 204: 
      print ("The following object was added to the group successfully: {}".format(self.patch_data_group["members.add"][0]["value"])) 
      jsonoutputlist.append(self.patch_data_group) 
    except urllib.error.HTTPError as err: #Python3 requires urllib.error.HTTPError to work. 
     print ("Error received from server: {}. HTTP Status code: {}".format(err.reason, err.code)) 

In dieser try-Anweisung, mit der Protokollierung und Ausdrucken der Code nie macht es in den "if" Anweisung ... und es scheint json.loads (err.read) liest den Fehler eigentlich nicht.

try: 
    json_error = json.loads(err.read) 
    if json_error: #Doesn't make it into the if statement when error is received. 
     print (json.dumps(json_error,sort_keys=True,indent=4, separators=(',', ': '))) 
except ValueError: 
    pass 
finally: 
    if f: f.close() 
    return (f) 

Ich verwende die folgenden in meinem Haupt-UI (nicht Worker-Thread) alle stdout die an den UI-Text auszusenden.

class EmittingStream(QtCore.QObject): 
    textWritten = QtCore.pyqtSignal(str) 
    def write(self, text): 
     self.textWritten.emit(str(text)) 
    def flush(self): 
     pass 

Jede Hilfe würde sehr geschätzt werden.

Danke,

Antwort

0

die Antwort nach weiteren Tests gefunden! json_error empfing den Fehler als Bytes und nicht als str. Ich fand, dass ich in meinem Code nur den ValueError passierte ... nicht Fehlerbehandlung entsprechend.

except ValueError: 
    pass 

Ich habe in dem folgenden:

except (TypeError, ValueError) as e: 
    print("Error: {}".format(e)) 
    pass 

Die erlaubte mir, die genauen Fehler ein Typeerror war zu sehen.

Gefunden mein Json_error wurde tatsächlich als ein Byte und nicht eine Zeichenfolge übergeben. Hinzugefügt .decode() zu meinem Code und jetzt gibt es den genauen Fehler aus.

json_error = json.loads(err.read().decode())