NX Lab

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

  1. 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ục Decorator bắt lỗi toàn cục

    Các bước thực hiện

    1. Viết decorator. Bọc hàm, bắt Exception.
    2. Ghi traceback vào file. traceback.format_exc().
    3. Báo gọn cho người dùng. NXMessageBox hoặc Listing Window.
    4. Phân biệt lỗi NX. NXException có ErrorCode.
    5. Á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.wraps giữ 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.