Gỡ lỗi tập lệnh
Hệ thống Scripting của Altium Designer cung cấp một môi trường gỡ lỗi đầy đủ tính năng. Scripting Debugger giúp bạn xác định và khắc phục lỗi trong script bằng cách cung cấp nhiều công cụ tự động và các bảng thông tin.
Lỗi Script
Các lỗi thường gặp bao gồm phương thức không hợp lệ, toán tử gom nhóm đặt sai vị trí, kiểu dữ liệu không khớp, lỗi logic và lỗi chính tả. Khi hệ thống scripting gặp lỗi, trình gỡ lỗi sẽ tạm dừng script và hiển thị hộp thoại lỗi cho biết vấn đề.
Ví dụ bên dưới cho thấy một script bị thiếu ký tự kết thúc và thông báo lỗi tương ứng trong hộp thoại lỗi.
Trình gỡ lỗi sẽ tạm dừng script khi gặp lỗi biên dịch hoặc lỗi thời gian chạy.
Sau khi đóng hộp thoại lỗi, bạn có thể sửa mã rồi chạy lại script. Nếu cần dừng script – chẳng hạn khi thực hiện từng bước – hãy dùng lệnh Stop (Run » Stop, Ctrl+F3) hoặc nút trên thanh công cụ Script Debug).
Gỡ lỗi Script
Hệ thống scripting cung cấp nhiều công cụ hỗ trợ gỡ lỗi script. Chúng bao gồm đặt nhiều breakpoint trong một script, dùng bảng Watch List để theo dõi giá trị của biến, dùng bookmark để di chuyển hiệu quả hơn và dùng các chức năng step into và step over để lần theo script.
Ví dụ, có thể dùng các tính năng sau khi kiểm tra giá trị của biến và biểu thức trong script:
► Xem Script Editor Tools để biết thông tin về cách sử dụng các công cụ của trình soạn thảo khi gỡ lỗi script.
Tracing
Để giúp tìm và xử lý một lỗi chưa rõ trong script, có thể chèn một loạt breakpoint vào script để tạm dừng mã tại nhiều vị trí trong khi kiểm tra giá trị của biến và biểu thức.
Tuy nhiên, tại bất kỳ thời điểm nào khi script đang tạm dừng, bạn cũng có thể cho script tiến từng dòng chức năng bằng các tính năng tracing/step của Debugger. Theo cách này, có thể dùng breakpoint để ban đầu tạm dừng script tại khu vực cần quan tâm, sau đó tiến từng dòng bằng tính năng tracing. Quá trình thực thi script từng dòng một được gọi là tracing hoặc script stepping.
Trình gỡ lỗi Script cung cấp các lệnh liên quan đến tracing – step into (Run » Step Into) và step over (Run » Step Over). Điều này cho phép bạn lần theo quá trình của script và phân tích hành vi của nó khi gỡ lỗi mã script.

Các lệnh Debugging có sẵn trong menu Run .
Lệnh Step Into
Quá trình Step Into thực thi script từng câu lệnh một. Lệnh này có sẵn trong menu Run , nút tương ứng trên thanh công cụ Script Debug hoặc phím tắt F7 .
Nếu câu lệnh đang được thực thi gọi một thủ tục khác, thao tác step into tại câu lệnh đó sẽ chuyển điều khiển tới dòng đầu tiên trong thủ tục được gọi. Phần tô sáng màu xanh đậu trong trình soạn thảo cho biết dòng mã mà script hiện đang thực thi tới. Quá trình script stepping được hủy bằng lệnh Run » Stop, phím tắt Ctrl+F3 hoặc nút trên thanh công cụ

Lệnh Step Over
Quá trình Step Over tương tự như Step Into, ngoại trừ việc nếu câu lệnh hiện tại là lời gọi tới một thủ tục khác, toàn bộ thủ tục được gọi sẽ được thực thi mà không dừng lại, thay vì lần theo từng bước bên trong thủ tục đó. Lệnh này có sẵn trong menu Run , nút tương ứng hoặc phím tắt F8 .
Lệnh này hữu ích khi đã xác định rằng một thủ tục called không phải là nguyên nhân gây ra vấn đề trong thủ tục hiện tại, giúp tránh việc phải lần theo không cần thiết từng dòng trong thủ tục được gọi – thủ tục đó sẽ được 'step over'.
Bảng Call Stack
Bảng Call Stack được dùng để xem chuỗi các thủ tục và hàm đã dẫn đến điểm thực thi hiện tại trong script đang được gỡ lỗi.

Bảng Call Stack
Khi bạn gỡ lỗi script theo từng bước, bảng sẽ hiển thị tên của bất kỳ hàm hoặc thủ tục nào mà bạn đi vào.
Khi gặp lời gọi đến một hàm hoặc thủ tục khác, bảng sẽ hiển thị tên của hàm/thủ tục bổ sung này khi nó được đi vào. Vì hàm/thủ tục đó được gọi từ bên trong một hàm/thủ tục khác, nên hàm/thủ tục ban đầu vẫn tiếp tục được hiển thị trong bảng.
Một 'call stack' thực chất sẽ được thiết lập, cho thấy mối quan hệ giữa các lời gọi hàm/thủ tục con. Hàm/thủ tục ban đầu xuất hiện ở đáy stack, và mỗi hàm/thủ tục được gọi tiếp theo nằm phía trên nó, cho đến hàm/thủ tục hiện đang được đi vào ở đỉnh stack.
Khi quá trình thực thi script thoát khỏi một hàm con/thủ tục con và quay trở lại hàm/thủ tục gọi nó, mục trước đó sẽ bị xóa khỏi stack và hàm/thủ tục gọi sẽ trở thành mục trên cùng của stack.
Nhấp đúp vào một mục trong bảng sẽ đưa bạn đến dòng script tương ứng nơi lời gọi tới hàm hoặc thủ tục được chọn được thực hiện. Dòng này sẽ được tô sáng bằng màu gắn với lỗi scripting và có hiển thị dấu đánh dấu lỗi scripting ở lề bên phải. Điều này chỉ được dùng cho mục đích tô sáng. Nó sẽ biến mất khi bạn nhấp vào tài liệu và không ảnh hưởng gì đến phiên gỡ lỗi.
Ngoại lệ và Thông báo
Như thường thấy trong mọi dự án lập trình, việc phát triển và gỡ lỗi mã script không nhất thiết dừng lại ở một script 'đã chạy được'. Rất có thể trong thực tế sử dụng, script sẽ gặp những lỗi không lường trước hoặc có thể không cho ra kết quả như mong đợi.
May mắn là có một số cách để dùng hệ thống scripting xử lý ngoại lệ trong quá trình thực thi và cung cấp phản hồi cho người dùng về hoạt động của script.
Trình xử lý ngoại lệ
Trong DelphiScript, từ khóa try giới thiệu một câu lệnh try-except hoặc một câu lệnh try-finally. Hai câu lệnh này có liên quan với nhau nhưng phục vụ các mục đích khác nhau.
Try Finally
Trong trình xử lý Try-Finally, các câu lệnh trong khối finally luôn được thực thi – bất kể có xảy ra lỗi ngoại lệ trong khối try hay không. Hãy dùng khối try-finally để giải phóng các đối tượng tạm thời hoặc tài nguyên khác, và thực hiện các tác vụ dọn dẹp.
Reset(F);
Try
// process file F
Finally
CloseFile(F);
End;
Try Except
Dùng câu lệnh Try-Except để bắt các ngoại lệ được phát sinh và thực thi mã xử lý lỗi liên quan. Ví dụ, có thể bắt một ngoại lệ cụ thể và cập nhật log hoặc mở hộp thoại lỗi mô tả. Một ngoại lệ mã trong khối try sẽ khiến khối except được thực thi.
Trong ví dụ bên dưới, thủ tục ApplyOffset được gọi, với các tham số phù hợp, từ thủ tục DefineOffset. Thủ tục này thực hiện một phép chia đơn giản (trên các biến Ydim và Zdim ) và hiển thị kết quả (Offset) trong một hộp thoại chuẩn.
Procedure ApplyOffset(Ydim, Zdim);
Var
Offset;
Begin;
Try
Offset := Ydim div Zdim;
ShowInfo('Calculated Offset = ' + IntToStr(Offset));
Except
ShowWarning('Entered Z dimension must be greater than zero.');
End;
End;
Procedure DefineOffset;
Begin;
ApplyOffset(32, 4);
End;
Với các tham số ApplyOffset được hiển thị ở trên (32,4), script khi thực thi sẽ hiển thị kết quả tính toán bằng thủ tục ShowMessage, như minh họa bên dưới.

Hoặc, khi thay đổi các tham số truyền vào thành 32,0 (ApplyOffset(32, 0);) sẽ gây ra ngoại lệ chia cho 0 trong phép tính Offset, kích hoạt khối xử lý Except. Khối này dùng thủ tục ShowWarning để hiển thị hộp thoại Warning phù hợp.

Raise
Giả định trong thủ tục xử lý lỗi đơn giản ở trên là ngoại lệ được phát sinh do lỗi chia cho 0, nhưng điều này có nghĩa là các loại ngoại lệ khác sẽ không được phản ánh chính xác trong nội dung cảnh báo của hộp thoại. Tuy nhiên, trong ví dụ này, đó là lỗi ngoại lệ có khả năng xảy ra cao nhất.
Dù vậy, dưới góc nhìn người dùng, vẫn cần có một hình thức phát hiện lỗi cụ thể. Trong DelphiScript, từ khóa Delphi On (để bắt một kiểu ngoại lệ được chỉ định) không được hỗ trợ, nhưng câu lệnh Raise có thể được dùng bên trong một khối Except để phát sinh lại ngoại lệ gần nhất (dù đó là kiểu nào).
Try
Offset := Ydim div Zdim;
ShowInfo('Calculated Offset = ' + IntToStr(Offset));
Except
Raise;
End;
Theo cách này, khi phần lớn mã của một thủ tục nằm trong khối try của câu lệnh try-except, mọi ngoại lệ đều có thể được báo cáo bằng câu lệnh Raise . Lưu ý rằng hộp thoại ngoại lệ sẽ chỉ hiển thị các thông báo lỗi chung chung, thay vì thông tin cụ thể của script.

Raise cũng có thể được dùng để chủ động tạo ngoại lệ khi đáp ứng các điều kiện kiểm tra cụ thể, ví dụ bằng cách áp dụng các câu lệnh if-then hoặc case đơn giản.
Procedure ApplyOffset(Ydim, Zdim);
Var
Offset;
Begin;
if Zdim > Ydim then
Begin;
Raise('Z dimension must be smaller than Y dimension.');
End;
Offset := Ydim div Zdim;
ShowInfo('Calculated Offset = ' + IntToStr(Offset));
End;
Tại đây, nếu tham số Zdim của ví dụ trên lớn hơn tham số Ydim thì một ngoại lệ (kèm thông báo) sẽ được phát sinh.

Lỗi trong VB Scripts
Phần triển khai VBScript trong scripting engine của Altium Designer có các hàm dựng sẵn có thể được dùng trong các dự án script VBScript, chẳng hạn như hàm MsgBox .
Câu lệnh On Error có thể được օգտագործել khi bẫy lỗi trong VB Scripts. Hãy tham khảo tài liệu Microsoft VBScript để biết thêm thông tin về cách bẫy lỗi.
Thông báo
Nói chung, thông báo là cách chính để nâng cao hoạt động của script từ góc nhìn người dùng.
Thông báo có thể cung cấp cảnh báo cho các ngoại lệ hoặc hiển thị thông tin trong quá trình chạy và các cảnh báo, đồng thời có thể được chèn vào các routine script xử lý dữ liệu đầu vào, tính toán, thao tác tệp hoặc bất kỳ quy trình nào mà việc cung cấp thông tin chi tiết về tiến trình sẽ có ích.
Hộp thoại thông báo
Cùng với hộp thoại thông báo cơ bản có sẵn trong hệ thống scripting (ShowMessage), còn có nhiều hộp thoại chuyên biệt để cung cấp phản hồi phù hợp hơn cho người dùng.
Chúng bao gồm các thủ tục thông báo như:
- ShowError
- ShowException
- ShowInfo
- ShowWarning
- và nhiều hơn nữa..
Bảng Messages
Messages panel của Altium Designer có thể là một công cụ gỡ lỗi hữu ích cho scripting, nhưng cũng có thể được dùng để cung cấp luồng thông tin thông báo hữu ích liên tục cho người dùng.
Messages panel là một đối tượng Workspace Manager, được truy cập từ giao diện Message Manager. Messages panel có thể được sử dụng trong script để hiển thị trạng thái của các biến và thuộc tính (hoặc bất kỳ dữ liệu nào khác) cho cả mục đích gỡ lỗi và phản hồi cho người dùng, như được minh họa trong ví dụ bên dưới.
Procedure CreateMessages;
var
WS : IWorkSpace;
MM : IMessagesManager;
Begin
WS := GetWorkSpace; // obtain Workspace Manager interface
MM := WS.DM_MessagesManager; // obtain Message Manager interface
MM.ClearMessages; // initialize
MM.BeginUpdate;
// add relevant messages here using MM.AddMesssage procedures
MM.EndUpdate;
WS.DM_ShowMessageView; // display messages
End;
)
)