Documents/QScriptのチュートリアル/Step7CueMol: Molecular Visualization Framework |
QScript実行時に発生するエラーへの対処法このサイトにあるスクリプトは一応エラーが出ないようになっている(はず)ですが, 自分で書いたスクリプトを実行させた場合, 往々にしてエラーが出て実行が中断してしまうことがあります. エラーには,
出るメッセージがあまり親切ではないですが, 一応エラーの特定は何とかできるようになっています, コンパイル時の文法エラー例えば,以下のスクリプトを実行した場合, 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は,以下のいずれかで行うことができます.
|