
Decorator bắt lỗi toàn cục: mọi script đều báo lỗi gọn, ghi traceback và không treo NX
#Python#Lỗi#Gỡ lỗi1 lượt xem
Quản trị viênQuản trị· 0 điểm
Câu hỏi ·
Lỗi không bắt sẽ in ra Information Window dài dòng, khó hiểu với người dùng. Một decorator bọc hàm main giúp mọi script có cách xử lý lỗi thống nhất: thông báo thân thiện cho người dùng, traceback đầy đủ vào log cho lập trình viên.
Decorator bắt lỗi toàn cụcCác bước thực hiện
- Viết decorator. Bọc hàm, bắt Exception.
- Ghi traceback vào file. traceback.format_exc().
- Báo gọn cho người dùng. NXMessageBox hoặc Listing Window.
- Phân biệt lỗi NX. NXException có ErrorCode.
- Áp dụng cho mọi main. Dùng @bat_loi trước hàm.
Code tham khảo (Python)
import functools import os import time import traceback import NXOpen THU_MUC_LOG = "D:/NXLab_log" def bat_loi(ten_tool): def trang_tri(ham): @functools.wraps(ham) def boc(*a, **kw): session = NXOpen.Session.GetSession() try: return ham(*a, **kw) except NXOpen.NXException as ex: ghi(ten_tool, "NXException %d: %s\n%s" % (ex.ErrorCode, ex.Message, traceback.format_exc())) bao(session, ten_tool, "NX từ chối thao tác (mã %d):\n%s" % (ex.ErrorCode, ex.Message)) except Exception as ex: ghi(ten_tool, "%s\n%s" % (ex, traceback.format_exc())) bao(session, ten_tool, "Lỗi chương trình: %s\n(Chi tiết đã ghi vào %s)" % (ex, THU_MUC_LOG)) return boc return trang_tri def ghi(ten_tool, noi_dung): os.makedirs(THU_MUC_LOG, exist_ok=True) with open(os.path.join(THU_MUC_LOG, "loi.log"), "a", encoding="utf-8") as f: f.write("=== %s | %s ===\n%s\n" % (time.strftime("%Y-%m-%d %H:%M:%S"), ten_tool, noi_dung)) def bao(session, tieu_de, noi_dung): if session.IsBatch: session.ListingWindow.Open() session.ListingWindow.WriteLine(noi_dung) else: NXOpen.UI.GetUI().NXMessageBox.Show(tieu_de, NXOpen.NXMessageBox.DialogType.Error, noi_dung) @bat_loi("Kiểm tra chi tiết") def main(): session = NXOpen.Session.GetSession() part = session.Parts.Work print(part.Leaf) # AttributeError nếu part là None -> decorator xử lý if __name__ == "__main__": main()Giải thích code
functools.wrapsgiữ nguyên tên và tài liệu của hàm gốc khi bọc.- Hai nhánh
except: lỗi NX có mã lỗi riêng, lỗi Python chung chung; cả hai ghi traceback đầy đủ. - Người dùng chỉ thấy câu ngắn gọn; chi tiết kỹ thuật đi vào
loi.logđể bạn đọc.
Lỗi thường gặp
- Decorator nuốt lỗi nên script gọi nó không biết đã thất bại; cân nhắc trả mã lỗi hoặc ném lại với tùy chọn.
- Đừng ghi dữ liệu nhạy cảm của người dùng vào log.
Code mang tính tham khảo, viết cho NX 12 trở lên (Python journal). Tên menu và một số lớp có thể khác theo phiên bản NX; hãy chạy thử trên bản sao của chi tiết trước khi dùng cho dữ liệu thật.
Điểm: 0
Trả lời
Đăng nhập để tham gia thảo luận.