スクリプトのデバッグ
Altium Designer のスクリプティングシステムは、フル機能のデバッグ環境を提供します。Scripting Debugger は、さまざまな自動化ツールと情報パネルを提供することで、スクリプト内のエラーを特定し解決するのに役立ちます。
スクリプトエラー
一般的なエラーには、無効なメソッド、グルーピング演算子の誤配置、型の不一致、ロジックエラー、タイプミスなどがあります。スクリプティングシステムがエラーに遭遇すると、デバッガはスクリプトを一時停止し、問題を示すエラーダイアログを表示します。
以下の例は、終端文字が欠けているスクリプトと、それに対応するエラーダイアログメッセージを示しています。
デバッガは、コンパイル時または実行時エラーに応じてスクリプトを一時停止します。
エラーダイアログを閉じたら、コードを修正してスクリプトを再実行できます。スクリプトを停止する必要がある場合(たとえば ステップ実行 中など)は、Stop コマンド(
:
スクリプトのデバッグ
スクリプティングシステムには、スクリプトのデバッグを支援するための各種ツールが用意されています。これには、スクリプト内に複数のブレークポイントを設定すること、
たとえば、スクリプト内の変数や式の値を確認する際には、次の機能を使用できます。
► エディタツールを使用してスクリプトをデバッグする方法については、Script Editor Tools を参照してください。
トレース
スクリプト内の不明なエラーを見つけて解決するために、複数のブレークポイントをスクリプトに挿入し、複数箇所でコードを一時停止させながら変数や式の値を確認できます。
ただし、スクリプトが一時停止している任意の時点で、デバッガのトレース/ステップ機能を使用して、機能的な1行ずつスクリプトを進めることもできます。この方法では、まずブレークポイントで関心のある領域でスクリプトを停止し、その後トレース機能で1行ずつ進められます。スクリプトを1行ずつ実行するプロセスは、トレース(tracing)またはスクリプトステップ(script stepping)と呼ばれます。
スクリプトデバッガは、トレースに関連するコマンド(Step Into(

Step Into コマンド
)、または
実行中のステートメントが別のプロシージャを呼び出す場合、そのステートメントに Step Into すると、呼び出されたプロシージャの先頭行に制御が移ります。エディタ内の黄緑色のハイライトは、スクリプトが現在実行しているコード行を示します。スクリプトのステップ実行は、
)でキャンセルできます。

Step Over コマンド
)、または
このコマンドは、現在のプロシージャにおける問題の原因が
Call Stack パネル
Call Stack パネルは、デバッグ中のスクリプトにおいて、現在の実行位置に至るまでに呼び出されたプロシージャおよび関数の連鎖を表示するために使用します。

Call Stack パネル
ステップデバッグを行うと、パネルには入った関数またはプロシージャの名前が表示されます。
別の関数またはプロシージャの呼び出しに遭遇すると、パネルには、その追加の関数/プロシージャに入った時点でその名前が表示されます。関数/プロシージャが関数/プロシージャの内部から呼び出される場合でも、元の関数/プロシージャはパネルに表示されたままです。
実質的に「コールスタック」が構築され、子孫の関数/プロシージャ呼び出し間の関係が示されます。元の関数/プロシージャはスタックの最下部に表示され、その上に後続で呼び出された関数/プロシージャが順に積み上がり、最上部には現在入っている関数/プロシージャが表示されます。
スクリプト実行がサブ関数/プロシージャから抜けて呼び出し元の関数/プロシージャに戻ると、前者はスタックから削除され、呼び出し元の関数/プロシージャがスタックの最上部になります。
パネル内のエントリをダブルクリックすると、選択した関数またはプロシージャの呼び出しが行われているスクリプト行へジャンプします。その行はスクリプトエラーに関連付けられた色でハイライトされ、右側マージンにスクリプトエラーマーカーが表示されます。これは純粋にハイライト目的で使用されます。ドキュメントをクリックすると消え、デバッグセッションを妨げることはありません。
例外とメッセージ
多くのプログラミングプロジェクトでよくあるように、スクリプトコードの開発とデバッグは、必ずしも「動作する」スクリプトで終わるとは限りません。実運用では、スクリプトが想定外のエラーに遭遇したり、期待した結果を返さなかったりする可能性があります。
幸い、スクリプティングシステムには、実行時例外を処理し、スクリプトの動作についてユーザーにフィードバックを提供するための方法がいくつも用意されています。
例外ハンドラ
DelphiScript では、try try-excepttry-finally
Try Finally
Try-Finally ハンドラでは、finally trytry-finally
Reset(F);
Try
// process file F
Finally
CloseFile(F);
End;
Try Except
Try-Except ステートメントを使用すると、発生した例外を捕捉し、関連するエラーハンドリングコードを実行できます。たとえば、特定の例外を捕捉してログを更新したり、説明的なエラーダイアログボックスを開いたりできます。tryexcept
以下の例では、ApplyOffsetDefineOffsetYdim Zdim Offset
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;
上記に示した ApplyOffset32,4ShowMessage

一方、渡すパラメータを 32,0ApplyOffset(32, 0);OffsetExceptShowWarning

Raise
上記の単純なエラーハンドリング手順では、例外はゼロ除算エラーに応答して発生するという前提になっています。しかしこの前提では、他の種類の例外が警告ダイアログの文言で正確に報告されません。ただしこの例では、遭遇する可能性が最も高い例外エラーです。
それでも、ユーザーの観点からは何らかの具体的なエラー検出が望まれます。DelphiScript では、Delphi の On Raise Except
Try
Offset := Ydim div Zdim;
ShowInfo('Calculated Offset = ' + IntToStr(Offset));
Except
Raise;
End;
このように、プロシージャのコードの大部分が try-except ステートメントの try Raise

Raise
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;
ここでは、上記例の ZdimYdim

VB スクリプトのエラー
Altium Designer スクリプティングエンジンにおける VBScript 実装には、VBScript のスクリプトプロジェクトで使用できる組み込み関数(MsgBox
On Error
メッセージ
一般に、メッセージはユーザーの観点からスクリプトの動作を強化するための主要な手段です。
メッセージは例外に対するアラートを提供したり、実行中の情報や警告を示したりでき、入力データ、計算、ファイル操作、または手順上の状況把握が有益となるあらゆる処理を扱うスクリプト ルーチンに挿入できます。
メッセージ ダイアログ
スクリプト システムで利用できる基本的なメッセージ ダイアログ(ShowMessage
これらには、次のようなメッセージ手続きが含まれます。
- ShowError
- ShowException
- ShowInfo
- ShowWarning
- など。
メッセージ パネル
Altium Designer の
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;