我正在运行一个PyQt5 UI,它通过REST API添加IP地址。当向我的工作线程发送操作时(运行一些for循环,并在这些循环中运行一些函数),每当我在代码中抛出异常时......它都不会从json.loads中打印出确切的错误。
我的主要目标是获得我收到的4xx或5xx错误的确切err.read(),以便告诉用户究竟发生了什么(将输出4xx和5xx错误,而不是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))
在这个try语句中,对于日志记录和打印输出,代码永远不会进入“if”语句......并且看起来json.loads(err.read)实际上并没有读取错误。
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)
我在主UI(不是工作线程)中使用以下内容将所有标准输出发送到UI文本框。
class EmittingStream(QtCore.QObject):
textWritten = QtCore.pyqtSignal(str)
def write(self, text):
self.textWritten.emit(str(text))
def flush(self):
pass
非常感谢任何协助。
谢谢,
答案 0 :(得分:0)
进一步测试后找到答案! json_error接收错误为字节而不是str。我发现在我的代码中我只是传递了ValueError ...而没有正确处理错误。
except ValueError:
pass
我在下面添加了:
except (TypeError, ValueError) as e:
print("Error: {}".format(e))
pass
这让我看到确切的错误是TypeError。
发现我的json_error实际上是以字节而不是字符串形式传递的。将.decode()添加到我的代码中,现在输出确切的错误。
json_error = json.loads(err.read().decode())