以下是為顯示 KPI 資訊而制作的倉庫工具。該程式可以正常運行一周,但是隨機凍結,我認為這是因為 Try/Except 沒有捕獲到例外。
我想如果我將整個批次包裝在 Try/Except 中,它會捕獲所有錯誤并在 20 秒后按預期重繪 。它在運行的大部分時間都有效。
我在這里錯過了一個重要的例外嗎?
def importData():
now = datetime.now()
date_time = now.strftime("%Y-%m-%d")
yesterday = date.today() - timedelta(days=1)
date_yesterday = yesterday.strftime("%Y-%m-%d")
express_time = date.today() - timedelta(days=4)
# --- Printed Data ---
try:
conn = http.client.HTTPSConnection()
payload = ''
headers = {
'Content-Type': 'application/json',
'StarShipIT-Api-Key': '',
'Ocp-Apim-Subscription-Key': ''
}
conn.request("GET", "/api/orders?status=Printed&sort_column=ShippedDate&sort_direction=descending&include=packages&include=events&page_size=10", payload, headers )
res = conn.getresponse()
raw_data = res.read()
decoded_data = raw_data.decode("utf-8")
filtered_data = re.findall(r'(?<=order_id).*?(?=Generation)',decoded_data)
order_number = re.findall(r'(?<=order_number":").*?(?=","reference)',decoded_data)
# --- Shipped Data ---
conn2 = http.client.HTTPSConnection()
payload2 = ''
headers2 = {
'Content-Type': 'application/json',
'StarShipIT-Api-Key': '',
'Ocp-Apim-Subscription-Key': ''
}
conn2.request("GET", "/api/orders?status=Shipped&sort_column=ShippedDate&sort_direction=descending&include=packages&include=events&page_size=10", payload2, headers2 )
res2 = conn2.getresponse()
raw_data2 = res2.read()
decoded_data2 = raw_data2.decode("utf-8")
filtered_data2 = re.findall(r'(?<=order_id).*?(?=Generation)',decoded_data2)
order_number2 = re.findall(r'(?<=order_number":").*?(?=","reference)',decoded_data2)
stored_data.extend(x for x in filtered_data if x not in stored_data)
stored_data.extend(x for x in filtered_data2 if x not in stored_data)
order_number.extend(x for x in order_number2 if x not in order_number)
pickle.dump(stored_data, open("stored_data.dat", "wb"))
today_data_d = [ x for x in stored_data if "printed_date\":\"%s" % date_time in x ]
today_data_c = [ x for x in today_data_d if "writeback_status\":\"Up to date" in x ]
today_data_b = [ x for x in today_data_c if "writeback_details\":\"Success" in x ]
today_data_a = [ x for x in today_data_b if "order_status\":\"Printed" in x ]
today_data = [ x for x in today_data_a if "writeback_details\":\"Already fulfilled" not in x ]
filter3_d = [ x for x in stored_data if "printed_date\":\"%s" % date_yesterday in x ]
filter3_c = [ x for x in filter3_d if "writeback_status\":\"Up to date" in x ]
filter3_b = [ x for x in filter3_c if "writeback_details\":\"Success" in x ]
filter3_a = [ x for x in filter3_b if "order_status\":\"Printed" in x ]
filter3 = [ x for x in filter3_a if "writeback_details\":\"Already fulfilled" not in x ]
filter4 = [ x for x in filter3 if "printed_date\":\"%sT12" % date_yesterday in x ]
filter5 = [ x for x in filter3 if "printed_date\":\"%sT13" % date_yesterday in x ]
filter6 = [ x for x in filter3 if "printed_date\":\"%sT14" % date_yesterday in x ]
filter7 = [ x for x in filter3 if "printed_date\":\"%sT15" % date_yesterday in x ]
filter8 = [ x for x in filter3 if "printed_date\":\"%sT16" % date_yesterday in x ]
filter9 = [ x for x in filter3 if "printed_date\":\"%sT17" % date_yesterday in x ]
filter10 = [ x for x in filter3 if "printed_date\":\"%sT18" % date_yesterday in x ]
filter11 = [ x for x in filter3 if "printed_date\":\"%sT19" % date_yesterday in x ]
filter12 = [ x for x in filter3 if "printed_date\":\"%sT20" % date_yesterday in x ]
filter13 = [ x for x in filter3 if "printed_date\":\"%sT21" % date_yesterday in x ]
filter14 = [ x for x in filter3 if "printed_date\":\"%sT22" % date_yesterday in x ]
filter15 = [ x for x in filter3 if "printed_date\":\"%sT23" % date_yesterday in x ]
filter4.extend(filter5)
filter4.extend(filter6)
filter4.extend(filter7)
filter4.extend(filter8)
filter4.extend(filter9)
filter4.extend(filter10)
filter4.extend(filter11)
filter4.extend(filter12)
filter4.extend(filter13)
filter4.extend(filter14)
filter4.extend(filter15)
today_data.extend(filter4)
print(len(today_data))
except: window.after(20000, importData)
uj5u.com熱心網友回復:
一般來說,不建議使用“裸”除。相反,捕獲例外資訊并將其記錄到日志檔案中:
import logging
logging.basicConfig(
filename='example.log',
format='%(asctime)-15s %(levelname)s: %(message)s',
encoding='utf-8',
level=logging.DEBUG
)
def importData():
try:
# your code goes here
except Exception as e:
logging.error(e)
window.after(20000, importData)
記錄到檔案的原因是使用tkinter程式,您甚至可能看不到標準輸出上的訊息。
如果發生例外,您至少可以在日志檔案中看到發生了什么。
logging.debug在整個程序中添加一些呼叫是個好主意importData,這樣您就可以看到發生了什么并檢查時間戳,這樣您就可以看到事情需要多長時間。一旦代碼按預期作業,您可以將日志記錄級別配置為 INFO,debug呼叫將被忽略。
如果你用 呼叫importData代碼after,它的執行會中斷mainloop. 而且由于網路回應時間是不可預測的,并且可能需要一段時間才能超時,這也可能是應用程式凍結的原因。
我的建議是importData作為第二個執行緒運行。讓它啟動一個while-loop 獲取資料(在 try/except 中)塊,然后在重試之前休眠一段時間。
如果您使用的是 Python 3,并且您tkinter的構建啟用了執行緒,您應該能夠從第二個執行緒更新小部件,因為一次只能有一個執行緒可以執行 Python 位元組碼。同時,網路 I/O 釋放 GIL,因此第二個執行緒不會阻塞 UI 執行緒。
如果要停止第二個執行緒,只需在主 UI 執行緒中設定running為from 回呼即可。False
import threading
import time
import tkinter as tk
running = True
def import_thread():
while running:
try:
# fetch data
# process data
# update widgets
except Exception as e:
logging.error(e)
# Maybe also write the error to a textbox?
time.sleep(20)
if __name__ == "__main__":
root = tk.Tk()
# create window and widgets here
it = threading.Thread(target=import_thread)
# You could also start the thread from a menu or button callback.
it.start()
root.mainloop()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/490114.html
