Step7
QScript実行時に発生するエラーへの対処法¶
このサイトにあるスクリプトは一応エラーが出ないようになっている(はず)ですが, 自分で書いたスクリプトを実行させた場合, 往々にしてエラーが出て実行が中断してしまうことがあります. エラーには,
- スクリプトのコンパイル時に発生する文法エラー(文末にセミコロンが無かった, etc)
- 実行時に発生するエラー(変数が未定義だった,etc) の2タイプがあります.
出るメッセージがあまり親切ではないですが, 一応エラーの特定は何とかできるようになっています,
コンパイル時の文法エラー¶
例えば,以下のスクリプトを実行した場合,
01:
02: $pwd = sys.getScriptPath();
03:
04: $mol = readPDB($pwd+"blm_ab.pdb","blm_ab");
05:
06: $mol.select(%{resi 1001%})
07: $r_blm = $mol.createRend("blm", "ballstick");
08: $r_blm.setProp("sphr", 0.2);
09: $r_blm.setProp("bondw", 0.2);
以下のようなエラーが出ます.
line 7: parse error at "$r_blm"
Layer2 compile error.
QsysModule> compile error
これは,6行目の最後にセミコロンが無いのが原因なのですが, エラーは7行目の$r_blmのところにあるといっています.
C等でプログラムを書いたことがある人ならわかると思いますが, QScriptでは改行は空白文字と同じで特に意味を持ちません. そのため,7行目の$r_blmをコンパイラーが読み込んだ時点で 「変だぞ」ということになり,エラーを出しているわけです.
まあ,大体エラーが出ている少し前を見れば原因が特定できると思います.
Compile errorが出た場合は,スクリプトの内容はまったく実行されていません. そのため,スクリプトを修正して,そのまま再実行してOKです.
実行時のエラー¶
実行時エラーが出た場合(より正しくは,発生した例外が拿捕されなかった場合), エラーメッセージが出力ウィンドウ(UNIX版の場合は端末)に表示されて 実行が中断されます.
例えば,以下のスクリプトを実行した場合は,
$pwd = sys.getScriptPath();
$mol = readPDB($pwd+"blm_ab.pdb","blm_ab");
$mol.select(%{resi 1001%})
$r_blm = $mol.createRend("blm", "ballstick");
$r_blm.setProp("sphere", 0.2);
$r_blm.setProp("bondw", 0.2);
以下のようなエラーメッセージが出ます.
******************************
*** ERROR ***
******************************
Exception name:
"runtime error"
Reason:
"unknown property sphere @ unknown in c:\proj\cuemol\src\qlib\PropContainer.hpp:299"
At the context:
1: proc () @ file "C:\proj\cuemol-tutorial\bleomycin\blm-xxx.qs" line 5
******************************
*** Interpreter status ***
******************************
--- interpreter status ---
... (省略) ...
--------------------------
ERRORの部分を見てください.(Interpreter statusの部分は重要な情報は無いので省略しています.)
"At the context:"というところに,どこでエラーが起きたが出ています. もし関数内でエラーが出た場合は,関数の呼び出し状況がすべてダンプされるので, どういう経緯で関数が呼び出されてエラーが出たか特定できます. ここでは,関数は使っていないので,proc ()(すなわちグローバルのコンテキスト)で エラーが出ていることがわかります.
あと,"reason:"というところに,何が原因でエラーが出たかが表示されています. ここでは,sphereというプロパティーが見つからない,というエラーが出ていることが わかります.(ballstickレンダラーのプロパティー名はsphereではなく,sphrである)
"Exception name:"は発生した例外の名前ですが, エラーの原因追及にはあまり役に立たないでしょう.
通常実行時エラーが発生すると,スクリプトの実行は中断されますが, try-catch文で当該部分を囲っておくと,エラーを拿捕して エラー処理をする・エラーの原因を解決して再実行する,などの処理を行うことができます.(画像ファイルへの書出しの現在の視点を保存するを参照)
あと,実行時エラーが出た場合は,エラーが出たところまではスクリプトは実行されていることになります.そのため,スクリプトを直して再実行する場合は,initializeを実行してから行ってください.Initializeは,以下のいずれかで行うことができます.
- GUI
- Menu "File"→"Initialize session"を実行する.
- Script
- qsys.cleanUpAll() を実行する.