(for Internet Explorer)
← ▼ ▲
↑
デバッガの不具合
Option Explicit
Class ClassA
Public m_A
End Class
main
Sub main
WScript.Echo "1"
Stop
Dim ClassA : Set ClassA = new ClassA
WScript.Echo TypeName(ClassA)
End Sub
デバッガを使う場合と使わない場合で動きが異なるものがあります。
クラス名と同じ名前のローカル変数を使うと、
・デバッガなし：正常動作
・デバッガあり：下記エラーで停止
Microsoft VBScript 実行時エラー: クラスが定義されていません。: 'ClassA'
クラス名と同じ名前のローカル変数
エラーメッセージの内容と有無
エラーメッセージは、デバッガに接続すると、標準エラー出力の代わりに、デバッガの
出力ウィンドウに表示されますが、内容が異なります。
C:\Folder\Sample.vbs(0, 1) ERROR: Pass.
デバッガなし ： 標準エラー出力へ
デバッガなし ： デバッガの出力ウィンドウへ
ERROR: Pass.
→ クラス名と同じ名前のローカル変数
→ エラーメッセージの内容と有無
ステップ・インで１ステップずつ実行しても、いきなりエラーが設定される
r = FuncA()
FuncA から戻ったときに r が宣言されていないときなど。
→ ステップ・インで１ステップずつ実行しても、いきなりエラーが設定される
← ▼ ▲
ステップ実行デバッグ
コーディングしたばかりのソースを始めて実行するときは、ステップ実行して１つずつ
実行の様子を確認するとよいでしょう。
Stop ← スタート
（コーディングしたばかりのソース１）
（コーディングしたばかりのソース２）
（コーディングしたばかりのソース３）
Stop ← ゴール
初めて実行するときは、コーディングしたばかりのソースの最初と最後に、Stop 命令
やブレークポイントを置きます。
途中でエラーが発生したら、エラーが発生した直前に、最初の Stop 命令やブレーク
ポイントを移動したり、コピーします。
（コーディングしたばかりのソース１）
（コーディングしたばかりのソース２）
Stop ← 続き
（コーディングしたばかりのソース３） ←エラーがあった
Stop ← ゴール
ステップ実行しているときに、自分でチェックしたことがあれば、それをテストスクリプト
に反映させるとよいでしょう。
最後の Stop 命令やブレークポイントに到達して、正しい結果が得られたら、
デバッグ完了です。
もし、到達しなかったら、異常終了した可能性があります。
← ▼ ▲
ブレークポイント
Visual Studio が起動してから、
[ デバッグ | ウィンドウ | ブレークポイント | 新規作成 | 関数でブレーク ]
で、関数にブレークポイントを張っておくと、スクリプトを再起動しても
ブレークポイントが張られた状態から起動できます。
関数名またはメソッド名を入力します。
クラスを指定することはできません。
（ClassA::MethodA と入力しても ClassA.MethodA と入力しても、止まりません。
← ▼ ▲
ウォッチ （変数の値をチェックする）
ブレーク中に表示されているソースに書かれている変数にカーソルを合わせると、値を確認できます。
[ デバッグ | ウィンドウ | ウォッチ ] で表示されるウィンドウに、選択中の変数をドラッグ＆ドロップする
と、値を表示し続けることができます。
クイックウォッチ
ウォッチ・ウィンドウ
← ▼ ▲
イミディエイトウィンドウ （実行してみる）
? FuncA( 23 )
True
デバッガでブレーク中に [ デバッグ | ウィンドウ | イミディエイト ] で表示したウィンドウに、一時的に
関数などを実行することができるウィンドウです。
上記の例は、ユーザーが定義した FuncA 関数を呼び出して、返り値を表示しています。
? は、Debug.Print の省略形です。
エラーが起きた場所で、正しいパラメーターを探すのに使えます。
r=2
式を評価できません。
? FuncA( r )
5
(Web)
エラーメッセージは気にしなくて構いません。
Dim x : SubA x : ? x
サブルーチン SubA が出力した x を表示する
← ▼ ▲
エラー処理, On Error
→ エラー出力
→ WshStdErrNumber
→ On Error ステートメント (Web)
→ Err オブジェクト
サブ・プロシージャと On Error の動き
デフォルトでは、エラーが発生すると、エラーメッセージを表示して、そこで終了します。
WScript.Echo Err ' 0 表示
NO_OBJ.ERROR ' エラー
WScript.Echo Err ' 実行しない
→ Windows Script Programming On Error Resume Nextの正しい使い方 (Web)
On Error Resume Next を実行した後なら、続きを実行します。
On Error Resume Next
WScript.Echo Err ' 0 表示
NO_OBJ.ERROR ' エラー
WScript.Echo Err ' 424 表示
プロシージャの中で On Error Resume Next を実行ても、プロシージャの外には影響しません。
WScript.Echo "Main" & Err ' Main 0 表示
SubA
NO_OBJ.ERROR ' エラー、終了
WScript.Echo "Main" & Err ' 実行しない
Sub SubA
On Error Resume Next
WScript.Echo "Sub " & Err ' Sub 0 表示
NO_OBJ.ERROR ' エラー、次へ
WScript.Echo "Sub " & Err ' Sub 424 表示
End Sub
次を実行しない
On Error Resume Next を実行してから呼び出したサブ・プロシージャの中で発生した場合、
エラーメッセージは表示しませんが、サブ・プロシージャの中で On Error Resume Next を
するかどうかで、動きが異なります。
サブ・プロシージャの中で On Error Resume Next をしないときは、終了ではなくプロシージャ
から戻って、メインの続きを実行します。
On Error Resume Next
SubA
WScript.Echo "Main " & Err ' Main 424 表示
Sub SubA
On Error Resume Next
WScript.Echo "Sub " & Err ' Sub 0 表示
NO_OBJ.ERROR ' エラー、次へ
WScript.Echo "Sub " & Err ' Sub 424 表示
End Sub
On Error Resume Next
SubA
WScript.Echo "Main " & Err ' Main 424 表示
Sub SubA
WScript.Echo "Sub " & Err ' Sub 0 表示
NO_OBJ.ERROR ' エラー、関数終了
WScript.Echo "Sub " & Err ' 実行しない
End Sub
エラー処理中として戻る
→ エラー処理 （Err版）
→ サブ・プロシージャと On Error
参考
→ エラー処理 （Err2版）
呼び出し元の関数で On Error Resume Next しているときのデバッグ
エラーが発生して初めてブレークするのは、On Error Resume Next をした
関数になります。呼び出し先のどこで発生したかを知るには、ステップ実行
するしかありません。
WScript.Quit すると、グローバル以外のオブジェクトの Class_Terminate は呼ばれません。
WSHでは、GoTo 文は使えません。
Dim en,ed
ErrCheck : On Error Resume Next
...
en = Err.Number : ed = Err.Description : On Error GoTo 0
If en = 2 Then ... : en = 0
If en <> 0 Then Err.Raise en,,ed
VBS では、エラーが発生すると、メッセージを表示して強制終了します。
On Error Resumt Next して、Err オブジェクトをチェックすると、エラー時の動作を変えることができます。
WScript.Quit
プログラムを終了します
エラー処理 （Err 版）
On Error Resume Next
On Error GoTo 0
If en = 2 Then ... : en = 0
Visual Studio 2005 のデバッガは、On Error Resume Next していないときにエラーが発生すると、
その続きを実行することはできません。 Visual Studio 2008 のデバッガは、エラーが発生しても、
ステップ実行で続きを実行することができます。
ただし、両デバッガとも、On Error Resume Next した後でエラーが発生してもブレークしません。
関連
→ Err2 のコーディング例 (TryStart, TryEnd)
Dim obj : Set obj = new ClassA
WScript.Echo "Not 'On Resume Next'"
Class ClassA
Private Sub Class_Initialize()
NO_OBJ.ERROR
End Sub
End Class
コンストラクタでエラーが発生すると、new の続きを実行してしまいます。
← On Resume Next をしていないのに、
実行してしまう。
→ ErrCheck
参考
← ▼ ▲
Err オブジェクト
(Web)
Err オブジェクトは、どこからでも参照できます。
Err.Number
エラー番号
Err.Description
最初にエラーを発生させたオブジェクトまたはアプリケーションの名前
Err.Source
→ エラー処理
On Error Resume Next
NO_OBJ.ERROR
WScript.Echo "Err.Number = " & Err.Number
WScript.Echo "Err.Description = " & Err.Description
WScript.Echo "Err.Source = " & Err.Source
Err.Clear
WScript.Echo "Err.Number = " & Err.Number
WScript.Echo "Err.Description = " & Err.Description
WScript.Echo "Err.Source = " & Err.Source
On Error GoTo 0
WScript.Echo ""
Err.Raise 62 'ファイルの最後を超えた入力を〜 エラー
サンプル
出力
Err.Number = 424
Err.Description = オブジェクトがありません。
Err.Source = Microsoft VBScript 実行時エラー
Err.Number = 0
Err.Description =
Err.Source =
C:\Documents and Settings\masanori.toda\デスクトップ\script.vbs(18, 1) Microsoft
VBScript 実行時エラー: ファイルの最後を超えた入力を行おうとしました。
Err.Clear
（関連） On Error GoTo 0 は
エラーをクリアします。 Err.Number は 0 になり、他のプロパティもリセットします。
エラー時の動き
が変わるだけでなく、エラーのクリアもします。
→ エラーメッセージ
エラーメッセージに出る値に 0x800A0000 を引いた値（？）
エラーが発生した行番号は取得できません
← ▼ ▲
エラーを発生させる
Err.Raise 1
エラー番号が 1〜0x7FFF の場合、エラーメッセージには、エラー番号＋
0x800A0000 した値がエラーコードとして表示されます。
「未知の実行時エラーです。」と表示されたエラー番号を
ユーザが使うことができそうです。下記のコードで確認できます。
Err.Number
エラー番号は下記のように確認できます。
→ Raise メソッド (Web)
object.Raise(number, source, description, helpfile, helpcontext)
エラーの補助情報も作成できます。 Err オブジェクトから参照できます。
Err.Raise vbObjectError + 1, "vbslib", "エラー1"
→ Raise (VBSLib)
Err.Raise vbObjectError + N
または
→ Raise メソッド (Web)
Option Explicit
On Error Resume Next
Dim i
For i=1 To &h7FFF
Err.Raise i
If Err.Description <> "未知の実行時エラーです。" Then
WScript.Echo Err.Description & "(" & Err.Number & ")"
End If
Err.Clear
Next
オートメーション オブジェクト内で独自のエラー番号を設定するときには
vbObjectError = 0x80040000 + N を指定することが MSDN に書かれていますが、
一部はすでに値が使われており、適当でないエラーメッセージが表示されます。
cscript errnum.vbs
プロシージャの呼び出し、または引数が不正です。(5)
オーバーフローしました。(6)
メモリが不足しています。(7)
インデックスが有効範囲にありません。(9) #########
固定サイズの配列、または現在、この配列はサイズを変更できない状態にあります。(10)
0 で除算しました。(11)
型が一致しません。(13) #########
文字列領域が不足しています。(14)
要求された操作を実行できません。(17) #########
スタック領域が不足しています。(28)
Sub または Function が定義されていません。(35)
DLL 読み込み時のエラーです。(48)
内部エラーです。(51)
ファイルの名前または数が不正です。(52)
ファイルが見つかりません。(53) #########
ファイルのモードが不正です。(54)
ファイルは既に開かれています。(55)
デバイス I/O (入出力) エラーです。(57)
既に同名のファイルが存在しています。(58) #########
ディスクの空き容量が不足しています。(61)
ファイルの最後を超えた入力を行おうとしました。(62) #########
ファイル数が多すぎます。(67)
このデバイスは使用できません。(68)
書き込みできません。(70) #########
ディスクは準備されていません。(71)
異なったドライブでも名前の変更はできません。(74)
パスまたはファイル名が無効です。(75) #########
パスが見つかりません。(76) #########
オブジェクト型の変数は設定されていません。(91)
For ループは初期化されていません。(92)
Null 値の使い方が不正です。(94)
必要なテンポラリ ファイルが作成できません。(322)
オブジェクトがありません。(424) #########
ActiveX コンポーネントはオブジェクトを作成できません。(429)
クラスはオートメーションをサポートしていません。(430)
オートメーションの操作中にファイル名またはクラス名を見つけられませんでした。(432)
オブジェクトでサポートされていないプロパティまたはメソッドです。(438)
オートメーション エラーです。(440)
このオブジェクトではサポートされていない操作です。(445)
このオブジェクトは、名前付き引数をサポートしていません。(446)
現在の国別情報の設定は、このオブジェクトではサポートされていません。(447)
名前付き引数が不正です。(448)
引数は省略できません。(449)
引数の数が一致していません。または不正なプロパティを指定しています。(450)
オブジェクトがコレクションではありません。(451)
指定された DLL に関数が定義されていません。(453)
コード リソースのロックエラーです。(455)
このキーは既にコレクション内の要素に関連付けられています。(457)
VBScript でサポートされていないオートメーションが変数で使用されています。(458)
リモート サーバ マシンが存在しないか、利用できません。(462)
ピクチャが不正です。(481)
この変数は宣言されていません。(500)
不正な代入です。(501)
このオブジェクトは safe モードでは作成できません。(502)
このオブジェクトは safe モードでは初期化できません。(503)
このオブジェクトは safe モードでは作成できません。(504)
不正な参照です。(505)
クラスが定義されていません。(506)
例外が発生しました。(507)
メモリが不足しています。(1001)
構文エラーです。(1002) #####
':' がありません。(1003)
'(' がありません。(1005)
')' がありません。(1006)
']' がありません。(1007)
識別子がありません。(1010)
'=' がありません。(1011)
'If' がありません。(1012)
'To' がありません。(1013)
'End' がありません。(1014)
'Function' がありません。(1015)
'Sub' がありません。(1016)
'Then' がありません。(1017)
'Wend' がありません。(1018)
'Loop' がありません。(1019)
'Next' がありません。(1020)
'Case' がありません。(1021)
'Select' がありません。(1022)
式がありません。(1023)
ステートメントがありません。(1024)
ステートメントの末尾が不正です。(1025)
整数型の定数がありません。(1026)
'While' または 'Until' がありません。(1027)
'While'、'Until' または終了するためのステートメントがありません。(1028)
'With' ステートメントがありません。(1029)
識別子が長すぎます。(1030)
不正な数字です。(1031)
文字が正しくありません。(1032)
終了していない文字列型の定数です。(1033)
終了していないコメントです。(1034)
'Me' キーワードの使い方が不正です。(1037)
'do' がありません。(1038)
不正な 'exit' ステートメントです。(1039)
'for' ループを制御する変数が不正です。(1040)
名前が二重に定義されています。(1041)
行頭のみ許されるステートメントです。(1042)
値渡しの変数に割り当てられません。(1043)
Sub プロシージャを呼び出すときに、かっこを使うことはできません。(1044)
リテラル定数を指定してください。(1045)
'In' がありません。(1046)
'Class' がありません。(1047)
クラスの内部で宣言しなければなりません。(1048)
プロパティの宣言に Let、Set または Get がありません。(1049)
'Property' ステートメントがありません。(1050)
プロパティで指定した引数の数は、同じでなければなりません。(1051)
クラスでは、既定のプロパティ/メソッドを複数個選択することはできません。(1052)
クラスの初期化または終了に引数がありません。(1053)
Property set または Property let には少なくとも 1 つの引数が必要です。(1054)
'Next' が不正です。(1055)
'Default' は 'Property'、 'Function' または 'Sub' の場合にのみ指定できます。(1056)
'Default' 指定する場合には、'Public' も指定されていなければなりません。(1057)
'Default' の指定は、 Property Get にのみ適用されます。(1058)
Microsoft VBScript コンパイル エラー(4096)
Microsoft VBScript 実行時エラー(4097)
Regular Expression オブジェクトがありません。(5016)
正規表現で構文エラーが発生しました。(5017)
文字の繰り返しを表す正規表現演算子が不正です。(5018)
正規表現の中に ']' を指定してください。(5019)
正規表現の中に ')' を指定してください。(5020)
文字セットの範囲が不正です。(5021)
JA(30000)
True(32766)
False(32767)
定義済みエラー番号
→ 定義済みエラー番号
結果例
1000〜4096 は、コンパイルエラーのようです。
Err.Raise で下記の番号を指定すると、エラーメッセージが自動的につきます
← ▼ ▲
デバッグ用ファイル出力
Sub main()
W_init
a = 1
W "a:" & a
W_finish
End Sub
main
' Debug Tool -----------------------------------------------------------
Sub W_init()
Set fs = WScript.CreateObject( "Scripting.FileSystemObject" )
On Error Resume Next
fs.DeleteFile "c:\wsh_dbg.txt"
On Error Goto 0
Set fs = Nothing
End Sub
Sub W(var)
Set fs = WScript.CreateObject( "Scripting.FileSystemObject" )
Set f = fs.OpenTextFile( "c:\wsh_dbg.txt", 8, True )
f.WriteLine( var )
Set f = Nothing
Set fs = Nothing
End Sub
Sub W_finish()
Set fs = CreateObject( "Scripting.FileSystemObject" )
Set f = Nothing
On Error Resume Next
Set f = fs.GetFile( "c:\wsh_dbg.txt" )
On Error Goto 0
If Not f Is Nothing Then
Set sh = WScript.CreateObject("WScript.Shell")
sh.Run "notepad.exe c:\wsh_dbg.txt"
Set sh = Nothing
End If
Set f = Nothing
Set fs = Nothing
End Sub
printf に相当するものは、 WScript.Echoです。
← ▼ ▲
動作ログ
Set fs = CreateObject( "Scripting.FileSystemObject" )
Set logg = fs.CreateTextFile( Wscript.ScriptFullName + ".log", True, False )
スクリプトは、バッチファイルのように動作中の様子を確認できません。
動作の様子をファイルに記録するコードを示します。
logg.WriteLine "...ing : " + s
logg.Close: fs.DeleteFile Wscript.ScriptFullName + ".log"
初期化：
後始末：
記録
動作の様子を、スクリプトファイルの名前＋".log" のファイル名で、記録します。
後始末まで到達したら、動作ログファイルは削除されます。
途中でエラーになったら、ファイルは残ります。
← ▲
エラーメッセージ、トラブルシューティング
識別子がありません。
800A03F2
識別子が予約語になっているかもしれません。
800A01B6
(438)
オブジェクトでサポートされていないプロパティまたはメソッドです。
800A01F4
この変数は宣言されていません
Dim で宣言してください
オブジェクトを代入する命令 "Set" が記述されていません
例： Set obj = FuncA()
引数の数が一致していません。
または不正なプロパティを指定しています。
引数の数があっているようなら、
Execute
したときにプロシージャの定義
が上書きされた可能性があります。 大文字小文字が違っても上書きします。
構文エラーです。
800A03EA
行番号が 0 のときは、Execute でロードした
問題のある VBS ファイルをダブルクリックすれば
問題のある行番号が分かります。
800A01C2
800A0400
ステートメントがありません。
→ 800A03EA
↓ エラーメッセージに表示されるエラーコード。 800A0000 + Err.Number
80070002
カレントディレクトリに設定しようとしたパスはフォルダではありません
ファイルは見つかりません。
800A0001
未定義のエラーです
.vbs のコードで発生させたユーザ定義エラー（エラーコード=1）です。
未知の実行時エラーです
→ エラーを発生させる
800A004C
(76)
→ 定義済みエラー番号
パスが見つかりません。
E_FileNotExist
800A0035
(53)
ファイルが見つかりません。
E_PathNotFound
書き込みできません。
800A0046
(70)
E_WriteAccessDenied
800A003E
(62)
ファイルの最後を超えた入力を行おうとしました。
E_EndOfFile
→ FileSystemObject::OpenTextFile
→ FileSystemObject::OpenTextFile
既に同名のファイルが存在しています。
800A003A
(58)
E_AlreadyExist
→ FileSystemObject::CreateTextFile
関連
E_WIN32_FILE_NOT_FOUND
→ vbslib エラーコード
→ Windows エラーコード
→ エラーメッセージの標準書式 (vbslib)
・フォルダと同じ名前のファイルを作ろうとすると、このエラーが発生します。
（ファイルと同じ名前のフォルダを作ろうとすると、エラー(58)になります。）
・同じファイルを複数開くことはできません。
開いてすぐ閉じるコードをばらまくことで、同じファイルを開いている別の場所を
探してください。
g_fs.OpenTextFile "a.txt", 8, True, -2 '[DEBUGGING]
a.txt
・ディスク・アクセスの負荷が高いときも、このエラーが発生します。
→ IsWriteAccessDenied
・ファイルと同じ名前のフォルダを作ろうとすると、このエラーになります。
→ デバッガの不具合
8007xxxx
→ Windows エラーコード (WinError.h)
8007007E
環境変数が必要な処理において、環境変数が設定されていない（？）
←