(for Internet Explorer)
← ▼ ▲
↑
NotCallFinish
Sub NotCallFinish()
Finish が呼ばれないで、クラスの Class_Terminate が呼ばれたときにエラー表示します。
関連
→ Class_Terminate の中のエラー
Private Sub Class_Terminate()
If en = 0 and not Me.IsFinished Then NotCallFinish
End Sub
サンプル：
(src)
← ▼ ▲
FinObj クラス (Finallyブロック)
FinObj クラスを使うと、Finally ブロックに似た記述をすることができます。
エラーが発生しても、続きを実行したり、キャッチしたりしませんが、Finally ブロックは実行します。
Sub FuncA( Path )
Dim fin : Set fin = new FinObj : fin.SetFunc "FuncA_Finally"
ren Path, "a.txt" : fin.SetVar "Path", Path '// 戻すときのデータを記録
:
fin.SetVar "Path", Empty '// 正常時は戻さないならデータを削除
End Sub
Sub FuncA_Finally( Vars ) '// Finally ブロックに相当
Dim en,ed : en = Err.Number : ed = Err.Description : On Error Resume Next '// This clears error
Dim path : path = Vars.Item("Path") '// 戻すデータを取得
If not IsEmpty( path ) Then ren "a.txt", path '// 戻す処理
ErrorCheckInTerminate en : On Error GoTo 0 : If en <> 0 Then Err.Raise en,,ed '// This sets en again
End Sub
FuncA_Finally
Path
FuncA_Finally
Path
ren Path, "a.txt"
ren "a.txt", path
記述例： 関数の場合
関連
→ Class_Terminate （デストラクタ）
(src)
ローカル変数のデストラクタが動く順番に依存しないようにしてください。
Sub FuncA( Path )
Dim fin : Set fin = new FinObj : fin.SetFunc "FuncA_Finally"
Dim ds_:Set ds_= New CurDirStack
fin.SetVar "CurDir", g_fs.CurrentDirectory
:
End Sub : Sub FuncA_Finally( Vars )
del Vars.Item("CurDir") + "\_temporary_folder"
End Sub
たとえば、下記のように、デストラクタでカレント・フォルダが変わるとき、FuncA_Finally が
呼ばれるタイミングが、カレント・フォルダが変わる前か後かどうか不定なので、Finally
ブロックで相対パスを指定することはできません。
Class ClassA
Public Sub FuncA( Path )
Dim fin : Set fin = new FinObj : fin.SetFunc "FuncA_Finally"
:
End Sub : Public Sub FuncA_Finally( Vars ) '// Finally ブロックに相当
:
End Sub
End Class
Sub ClassA_FuncA_Finally( Vars ) : Vars.Item("Me").FuncA_Finally( Vars ) : End Sub
記述例： メソッドの場合
→ ErrorCheckInTerminate
← ▼ ▲
処理フロー (Err2)
→ エラーが Err2.Clear または再 Raise されないで終了したときの処理フロー
エラーが発生して終了するとき
→ エラーが発生して終了するとき
正常終了するとき
→ 正常終了するとき
VBScript global code
ResumePop
CallFinalizeInModules
:
Err.Raise
g_FinalizeInModulesCaller.Class_Terminate
CallFinalizeInModules
1
(= g_FinalizeModules(i))
FinalizeModule (vbslib.vbs)
0
(= g_FinalizeModules(i))
FinalizeModule (vbslib.vbs)
On Error Goto 0 していないときは 1
(メインvbs の vbslib include)
(メインvbs の vbslib include)
VBScript global code
→ 処理フロー （vbs_inc/setting）
関連
← ▼ ▲
困ったときは？ （デバッグ）
→ デバッグを開始する
エラーメッセージを見ても分からないときは、スクリプトの開発者に質問してください。
あなたが開発者であるときは、デバッグモードで動かしてみてください。
ソフトウェアデザイン館 Sage Plaisir 21 http://www.sage-p.com/
サポート
→ vbslib2 から vbslib3 へ移植するには
→ エラーメッセージの標準書式
ホームページにあるサポート掲示板かメールアドレスへ
→ エラーコード
→ 長い文字を入力するときの注意
→ g_count, g_count_up
… スルーカウンタ
→ 条件ブレーク
→ ファイル出力を開始するタイミングでブレークする
→ SetupDebugTools
→ ウォッチ (WS, WD, WX)
… デバッグ機能の設定場所
→ g_debug_params
… 起動時のパラメーターを指定する
→ WSH のデバッガー
← ▼ ▲
デバッグを開始する, g_debug (vbslib)
debugger.bat
Test.vbs ファイルをデバッガにアタッチします
@wscript //x Test.vbs
@pause
g_debug
モジュールの一部が動きますが、
そこをデバッグするときは、下記のバッチファイルを実行してください。
デバッグを中止するときは、kill_wscript.bat を実行してください。
デバッグを中止するときは、コマンドプロンプトを閉じてください。
コマンドプロンプトが表示されていないときは、kill_wscript.bat を実行してください。
C:\home\sample.vbs(34, 3)
Microsoft VBScript 実行時エラー: この変数は宣言されていません。: 'e'
デバッガが無くても、g_debug=1 にすれば、エラーメッセージが詳しくなることがあります。
[ERROR](500) この変数は宣言されていません。
g_debug=0
g_debug=1
g_debug=1 にすると、詳しい動作内容が表示されたり、エラーが発生したらブレーク
したりするなど、若干動きが異なります。 この動きをさせないで、デバッガに接続する
には、g_debug=0 にして、下記のバッチファイルを実行してください。
vbs_inc
内部で、デバッガに接続するまでに、
@cscript //x Test.vbs /g_debug:0
@pause
Test.vbs ファイルをデバッガにアタッチします
debugger.bat
デバッガを終了する
デバッグモードにしないでデバッガに接続
wscript ではないことに注意
g_CommandPrompt
=0 なら wscript にしてください
ただし、
vbslib include や、vbs_inc モジュールのデバッグ
wscript であることに注意
デバッガが無いときの g_debug
ただし、行番号が出るのは、文法エラーのみです。
コールスタック（デバッグ | ウィンドウ | 呼び出し履歴）を見れば、全体から見てどの部分で
止まっているかが分かります。 開いているソースの絶対パスは、１行目に自動的に挿入
されています。 一部のオブジェクト（静的オブジェクト）は、DefineInfo.FullPath プロパティに、
クラスを定義しているソースの絶対パスが入っています。DefineInfo プロパティが無くても、
メソッドにステップインしたときのソースの１行目から分かります。
→ デバッガを終了する
→ デバッガが無いときの g_debug
→ デバッグモードにしないでデバッガに接続
→ vbslib include や、vbs_inc モジュールのデバッグ
デバッガで開いているソースの場所を知る
→ デバッガで開いているソースの場所を知る
'// C:\Folder\vbslib\Sample.vbs ... デバッグ時に自動的に付きます
Dim g_SrcPath
Class Sample_vbs : Public FullPath : End Class
Dim g_Sample_vbs
Set g_Sample_vbs =_
new Sample_vbs
With g_Sample_vbs
.FullPath = g_SrcPath
End With
Class ClassA
Public Property Get DefineInfo() : Set DefineInfo = g_Sample_vbs
End Property
End Class
メイン・スクリプトのパスは、WScript.ScriptFullName プロパティの値を見れば
分かりますが、インクルードしたスクリプトのパスは、通常分かりません。
しかし、g_debug=1 でデバッガに接続したときに表示される vbslib のソースは、
１行目に絶対パスが記述されたコメントが付きます。
また、ソースの先頭に下記のような記述があり、
g_SrcPath の値を代入した g_〜_vbs.DefinePath 変数の値に、インクルードしたスクリプト
のパスが入っています。 Visual Studio では、この変数を選択してウォッチ・ウィンドウへ
ドロップし、値（パス、" "付きでも可）をコピーして、 ファイル・オープンで開けます。
もし、g_〜_vbs.DefinePath 変数が無くても、最後の call_vbs, call_vbs_d が呼び出している
関数を定義しているスクリプトのパスなら、g_SrcPath の値から知ることができます。
最後以外は、コールスタックを目的の call_vbs, call_vbs_d に切り替えて、 path 引数
の値を調べることで分かります。
また、下記の式の値が True なら、最後の call_vbs, call_vbs_d が、メイン・スクリプト
の関数を呼び出していると判断できます。
g_SrcPath = WScript.ScriptFullName
→ エラー、デバッグ (VBScript)
→ ファイル出力を開始するタイミングでブレークする
g_SrcPath
.vbs ファイルの先頭
vbs ファイルが、main 関数を持ち、include もされる場合、上記の実装では、二重定義
エラーになります。 下記のように実装してください。
Dim g_Sample_vbs
If IsEmpty( g_Sample_vbs ) Then Declare_g_Sample_vbs
Sub Declare_g_Sample_vbs
ExecuteGlobal "Class Sample_vbs : Public FullPath : End Class"
Set g_Sample_vbs =_
new Sample_vbs
With g_Sample_vbs
.FullPath = g_SrcPath
End With
End Sub
Sub main2( Opt, AppKey )
g_SrcPath = WScript.ScriptFullName : Declare_g_Sample_vbs
:
→ 条件ブレーク
→ g_count, g_count_up
→ コマンドラインやショートカットからデバッガーに接続する
→ メッセージボックス (VBScript)
g_debug=0
main.vbs
→ SetupDebugTools
→ SkipToSection
インクルードしたファイルにコンパイルエラーが発生したときのデバッグ (g_is_compile_debug)
インクルードしたファイルがコンパイルエラーしたときは、g_is_compile_debug = 1 として
起動すると、コンパイルエラーがあった vbs ファイルがある行を開きます。 ただし、
'--- start of parameters for vbslib include -------------------------------
g_debug = 0 '// release:0, debug:99, -1:call SetupDebugTools
Dim g_is_compile_debug : g_is_compile_debug = 1
Setting_getEditorCmdLine
に、行番号を指定して開くことができるテキストエディタが
すでに登録してある必要があります。
→ コンパイルエラーが発生したときのデバッグ (g_is_compile_debug)
→ T_CompileDebug フォルダ
テスト
→ 動作モード、デバッグ関係のグローバル変数
簡易版
→ get_DefineInfoObject
エラーが発生したら、エラーが発生した瞬間でブレーク（一時停止）するために必要な、
デバッガにアタッチして、１つ目のエラーでブレークする
g_debug = 1
テスト
子プロセスでブレーク(Stop)する
ブレークしたい場所に Stop 命令を記述してデバッガーに接続しても、RunProg 関数など
で起動した子プロセスが Stop 命令を実行したときは、ブレークしません。
→ 子プロセスでブレーク(Stop)する
ソース・ファイルの中の任意の場所でブレーク（一時停止）する
→ ソース・ファイルの中の任意の場所でブレーク（一時停止）する
デバッガー（不具合を修正するツール） を使うと、スクリプトの中を１つずつ実行したり、
変数の値を確認したりできます。
エラーが発生した瞬間のスクリプト内部の様子を調べる
→ エラーが発生した瞬間のスクリプト内部の様子を調べる
下記のファイルをテキストエディタで開いて次のように変数の値を修正すると、
デバッガに接続して問題がある場所で停止します。
"Sample.vbs"
----------------------------------------------------------------------
g_debug = 1
----------------------------------------------------------------------
[ERROR](500) この変数は宣言されていません。
表示されるエラーメッセージの例
Sample.vbs
関連
→ テストが Fail したとき
多くの場合、内部関数の中でブレークしてしまうので、自分が扱っているスクリプトが見つ
かるまで、コールスタック（デバッグ | ウィンドウ | 呼び出し履歴）を開いて、探してください。
深い
浅い
エラーが発生した瞬間でブレークさせるには、２つの方法があります。 １つは、メイン・
スクリプトの
の中にある g_debug = 0 を編集してください。
もう１つは、*.vbs ファイルのショートカットを作成して、右クリック [ プロパティ ] の [ リンク先 ]
に、/g_debug:1 オプションを設定してください。
...\sample.vbs /g_debug:1
リンク先：
１つ目のエラーでブレークする
g_debug
などに設定すべき値が自動的に表示されます。
デバッガーは、Visual Studio Standard 以上、または MS-Office 付属の
ブレークしたいソースの場所に、Stop:OrError を記述して実行してください。
→ g_count, g_count_up
２回目以降でブレークする方法
→ 条件ブレーク
関連
編集したら、スクリプトを再度実行してください。
→ T_Err2_Debug2_WithDebugger_WithBreak2_shortcut.vbs # [main]
→ エラー処理のデバッグ
Microsoft Script
Editor
に含まれています。 無料の
下記のファイルをテキストエディタで開いて次のように変数の値を修正すると、デバッガ
に接続して問題がある場所で停止します。
"sample.vbs"
----------------------------------------------------------------------
g_debug = 1
----------------------------------------------------------------------
<ERROR err_number='1' err_description='Stop:OrError'/>
その状態で実行すると、Stop:OrError を記述した場所でブレークします。
g_debug などの変数に設定すべき値が書かれたコードが表示されます。 このコードを、
メイン.vbs の最後にある SetupVbslibParameters 関数の最後に記述してください。
Stop:OrError
SetupVbslibParameters
コマンドラインやショートカットからデバッガーに接続する
とすると、デバッガーに接続します。 /g_debug:1 にすると、１つ目のエラーでブレーク
します。
cscript //x sample.vbs /g_debug:99
コマンドライン：
ショートカットのリンク先：
"C:\Folder\sample.vbs" /g_debug:99
WSH のデバッガー
をインストールしてから、
関連
→ デバッグを開始する, g_debug (vbslib)
→ WSH のデバッガー
scd10jp.exe
も使えます。
← ▼ ▲
WSH のデバッガー
→ コマンドラインやショートカットからデバッガーに接続する
デバッガーの起動の仕方：
MS製のデバッガーは、すべて同じ方法でデバッガーを起動できます。
→ デバッガ （Visual Studio などに統合された機能）
インストール
vbslib を使う場合：
vbslib を使わない場合：
→ デバッガ （Visual Studio などに統合された機能）
← ▼ ▲
g_count, g_count_up
If g_count_up(0)=0 Then Stop '// watch-> g_count [DEBUGGING]
echo_v "g_count(0)=" & g_count(0)
If g_count_up(0)=2 Then Stop
Function g_count_up( i as integer ) as integer
グローバル配列変数 g_count の１つの配列要素の値を＋１します。
→ スルーカウンタ
【引数】
i
カウンタの種類の番号、配列要素番号（０以上）
新しい配列要素の値
返り値
デバッグ用です。 参考
問題が発生した場所の少し前でブレークさせたい場所で、まず下記のように記述します。
複数のカウンタを使うときは引数 0 を変えてください
実行させてエラーが発生した場所でブレークしたら、g_count(0) の値をウォッチします。
0 は、g_count_up の ( ) の中と同じです。 ウォッチするのは、g_count_up ではないことに
注意してください。
g_count(0) の値がウォッチした値と一致したらブレークするように、記述を変更します。
0
0
2
再び最初から実行させると、上記の Stop で止まります。
g_count(0)
← ウォッチ
← g_count(0) をウォッチしたら 2 だった場合
(src)
関連
→ スルーカウンタ (C言語 - errors)
0
→ 条件ブレーク
← ▼ ▲
特定の条件を満たしたときだけブレークしたいときは、次のように記述します。
If ... Then SetVar "Stop1", 1 '// 条件の判定 [DEBUGGING]
:
If GetVar( "Stop1" ) Then Stop '// ブレークする場所 [DEBUGGING]
条件ブレーク
← ▼ ▲
ファイル出力を開始するタイミングでブレークする
→ SetBreakByFName
出力ファイルの内容に問題があるときは、ファイル名を指定するだけで、
ファイルの出力を開始するところでブレークさせることができます。
参考
← ▼ ▲
処理の詳細表示 (g_verbose)、トレース表示
Dim g_verbose as boolean
Verbose モードが有効かどうか。
ファイル：
vbs_inc_400.vbs
Verbose モードが有効であるときは、内部処理の内容を詳しく表示しながら実行します。
サンプル （デバッグ時）
サンプル （開発時）
g_verbose = 1
FuncA
pause
If g_verbose Then echo_v "処理は１つも行われませんでした。"
Verbose モードで内部処理を表示する主な目的は、行われるはずの処理が行われて
いない不具合を解決することです。 処理が行われなかった
ことを中心に表示してください。 そうしないと、必要な情報が多くのノイズ（情報）に
隠れてしまいます。 とりあえず Verbose モードで動かし、そこからどの情報を詳しく
表示するようにすればいいか、どのオブジェクトを GetEchoStr で表示させるとよいか
をガイドできればよいでしょう。
関連
FuncA の処理内容を詳しく表示します。
テスト
→ T_Verbose.vbs # [T_Verbose]
→ echo_v
プログラムが処理内容に対してメタな処理になっているときに処理のステップを表示
したいときは、そのモジュールのメンバーに Verbose モードを追加してください。
← ▼ ▲
SetupDebugTools
Sub SetupDebugTools()
'--- start of parameters for vbslib include ---------
g_debug = 0 '// release:0, debug:99, -1:call SetupDebugTools
Sub SetupDebugTools() : set_input "" : SetBreakByFName Empty : End Sub
g_debug = 99 '// 上書きすることで、上記のデフォルトのコードを保護します。
Sub SetupDebugTools() '// 関数も前の定義を上書きできます。
del "C:\Users\user1\Desktop\TestData"
set_input "1."
SetBreakByFName "Out.xml"
End Sub
サンプル：
デバッグ時に main 関数を呼び出す直前で呼び出される関数。
また、この関数の中では、利便性のために
Out of Writable 警告
を発しません。
ただし、ファイルパスを指定するときは変数を使わないようにするなどして、予想外のファイル
を壊さないように注意してください。
set_input
SetBreakByFName
(src)
通常、vbslib include に、SetupDebugTools 関数の定義を記述します。
デバッグ用に何らかの設定をしたり、ファイルを初期状態に戻すなどの処理を、この関数の
中に定義してください。 main 関数の最初に記述しても同じことができますが、vbslib を
インクルードする前に、vbslib など vbs_inc でインクルードする関数が使え、g_debug の設定
の直後に処理を記述できるため、デバッグ用のコードを一般のコードと区別できます。
→ [T_SetupDebugTools] デバッガ時の初期設定
テスト
← ▼ ▲
ウォッチ (WS, WD, WX)
Sub WS2( Label as string, Value as variant )
Sub WD2( Label as string, Value as variant )
Sub WX2( Label as string, Value as variant )
Sub MARK( Label as string, out_Count as variant )
ブレークしないで、変数の値を標準出力へ表示します。
スレッドの通過を表示します
文字列値を表示します
数値を表示します
数値を16進数で表示します
<WATCH label="var1" value="123"/>
出力例：
サンプル：
Dim var1 : var1 = 123
WD2 "var1", var1
Dim var1 : var1 = 123
Execute WD("var1")
Function WD( Expression as string ) as string
Function WS( Expression as string ) as string
Function WX( Expression as string ) as string
数値を16進数で表示するコードを返します
数値を表示するコードを返します
文字列値を表示するコードを返します
(src)
MARK "a", 0
関連
→ Execute_Echo
← ▲
エラー処理のデバッグ
エラーが発生した後の処理を、デバッグする方法を示します。
→ エラーが発生した瞬間のスクリプト内部の様子を調べる
まず、エラーが発生した瞬間を捕らえて、その場所に Stop 命令を記述します。
参考
→ ソース・ファイルの中の任意の場所でブレーク（一時停止）する
… Stop 命令
g_debug
を 99 など大きな数に設定して起動します。
Stop したら、ステップ実行します。
1.
2.
3.