QScriptのチュートリアルへ戻る

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() を実行する.

Last-modified: Sun, 06 Jun 2004 21:03:33 JST (7261d)