←
▼
▲
Public Number ' Err.Number
Public num ' Err.Number
Public Description ' Err.Description (Error Message)
Public desc ' Err.Description (Error Message)
Public Source ' Err.Source
Public ErrID ' count of (num <> 0) in each first Copy after Clear
Public RaiseID ' count of (num <> 0) in Copy
Public BreakErrID ' as integer
Public BreakRaiseID ' as integer
(src)
Dim g_Err2 as Err2
メンバ関数
err オブジェクトの内容をコピーします。
エラーの内容を出力します。
同じ内容のエラーを再度発生させる。
エラーの内容を変えて、再度エラーを発生させる。
エラーをクリアする。
TryStart を呼び出すと、Err2 オブジェクトを取得できます。
また、g_Err2 グローバル変数からアクセスすることもできます。
メンバ変数
関連
テスト
→ T_Err2 フォルダ
→ [T_Err2] Err2 オブジェクトのテスト
←
▼
▲
Property Get Err2::Number() as integer
エラーコード。
Property Get Err2::num() as integer
←
▼
▲
Property Get Err2::Description() as string
エラー・メッセージ。
Property Get Err2::desc() as string
←
▼
▲
Property Get Err2::ErrStr() as string
XML形式のエラーメッセージ。
エラーメッセージの例:
<ERROR err_number='500' err_description='この変数は宣言されていません。'/>
関連
←
▼
▲
Function Err2::GetErrStr() as string
標準形式のエラーメッセージを返す。
(src)
エラーメッセージの例:
<ERROR err_number='500' err_description='この変数は宣言されていません。'/>
関連
廃止されました
←
▼
▲
Property Get Err2::DebugHint() as string
エラーの内容とデバッグのヒント。
サンプル:
If TryStart(e) Then On Error Resume Next
...
If TryEnd Then On Error GoTo 0
If e.num <> 0 Then echo e.DebugHint : e.Clear
エラーメッセージの例:
下記のファイルをテキストエディタで開いて次のように変数の値を修正すると、
デバッガに接続して問題がある場所で停止します。
"T_Err2_Clear.vbs"
------------------------------------------------------------------
g_debug = 2
------------------------------------------------------------------
<ERROR err_number='500' err_description='この変数は宣言されていません。'/>
テスト
→ T_InputCommand.vbs # T_InputCommand_ForgetClear
←
▼
▲
Function Err2::Value() as string
エラーの内容を文字列型で返します。
(src)
廃止されました
←
▼
▲
Sub Err2::Copy( err as Err )
err オブジェクトの内容をコピーします。
(src)
←
▼
▲
Sub Err2::Raise()
同じ内容のエラーを再度発生させる。
(src)
←
▼
▲
Sub Err2::OverRaise( e_num as integer, e_desc as string )
エラーの内容を変えて、再度エラーを発生させる。
(src)
←
▼
▲
Sub Err2::Clear()
エラーをクリアする。
エラー処理が終わったことを示すため、メンバ変数をリセットします。
num = 0 : Description = "" : RaiseID = 0
(src)
関連
エラーメッセージを取得する
エラーの情報コピーしてクリアする
←
▼
▲
Sub Err2::CopyAndClear( out_e2 as Err2 )
エラーの情報を out_e2 にコピーしてから Err2 のエラーをクリアします。
参考
内部で Err2 オブジェクトが生成されて、out_e2 に格納されます。
テスト
→ T_Err2_Main.vbs # T_Err2_CopyAndClear
(src)
←
▼
▲
Sub Err2::EnqueueAndClear()
エラーの情報を Err2 の内部キューに入れてから Err2 のエラーをクリアします。
テスト
→ T_Err2_Main.vbs # T_Err2_EnqueueAndClear
サンプル
Dim e ' as Err2
If TryStart(e) Then On Error Resume Next
Err.Raise 1,, "Error1"
If TryEnd Then On Error GoTo 0
e.EnqueueAndClear
If not IsEmpty(e) Then s = e.DequeueAll() : If s <> "" Then Raise 1, s
EnqueueAndClear
(src)
←
▼
▲
Function Err2::DequeueAll() as string
Err2 の内部キューの内容を返し、内部キューを空にします。
テスト
→ T_Err2_Main.vbs # T_Err2_EnqueueAndClear
エラーがキューに入っていないときは、"" を返します。
参考
(src)
<ERROR msg="Error1"/>
<ERROR msg="Error2"/>
XML 書式のエラーメッセージを取得したいときは、ルート要素(タグ)を追加する
必要があるか検討してください。
サンプル返り値
←
▼
▲
Dim Err2::ErrID as integer
エラーの通し番号。
エラーが発生して初めての TryEnd を通ったとき +1 されます。
Err2::Clear した後で、次のエラーが発生すると +1 されます。
関連
←
▼
▲
Dim Err2::RaiseID as integer
エラーの通し番号。
エラーが発生して TryEnd を通るたびに +1 されます。
Err2::Clear で 0 に戻ります。
←
▼
▲
Dim Err2::BreakErrID as integer
デバッガでブレークするエラーの通し番号。
エラーメッセージの前に g_debug を設定するように表示されます。 このメッセージに従って、
デバッガを起動すると、エラーが発生した場所でブレークします。
下記のファイルをテキストエディタで開いて次のように変数の値を修正すると、
デバッガに接続して問題がある場所で停止します。
"T_Err2_Clear.vbs"
------------------------------------------------------------------
g_debug = 2
------------------------------------------------------------------
<ERROR err_number='500' err_description='この変数は宣言されていません。'/>
Visual Studio 2008 以降では、エラーが発生した場所からステップ実行することができます。
'--- start of parameters for vbslib include -------------------
g_debug = 1.5
エラーが発生したら Err2::ErrID が+1されますが、Err2::ErrID = Err2::BreakErrID に
なったら、エラーによってデバッガでブレークします。 次に Err2:ErrID が+1されるのは、
Err2::Clear した後にエラーが発生したときです。 それまでの Err.Raise では、Err2:ErrID
ではなく、Err2:RaiseID が+1されます。
ただし、TryStart 〜 TryEnd の間ではないとき(On Error Next Resume を実行していない
とき)にエラーが発生したときは、Err2::BreakErrID の値にかかわらず、エラーが発生したら
必ずエラーブレークします。
サンプル:
参考
関連
g_Err2.BreakErrID を 1.5 とすると、Err2::ErrID が 1 のときのエラーをキャッチする
TryEnd または Trying でブレークします。
通常、
vbslib.vbs をインクルードしたら、g_Err2::BreakErrID に設定されます。
は、エラーではありませんが、内部で Err.Raise を呼び出しているため、
Err2:ErrID が+1されます。
に設定してください。
g_debug が小さすぎると、後で復帰するために問題の無いエラーでブレークします。
また、ブレークしたときはエラー復帰が行われなくなります。
とりあえずデバッガに接続したいときは、十分に大きい値を設定するか、0 に設定して
エラーメッセージから必要な値を確認してください。
←
▼
▲
Dim E_Others : E_Others = 1
Dim E_TestPass : E_TestPass = 21
Dim E_TestSkip : E_TestSkip = 22
Dim E_TestFail : E_TestFail = 23
Dim E_BuildFail : E_BuildFail = &h80041004
Dim E_OutOfWritable : E_OutOfWritable = &h80041005
Dim E_NotFoundSymbol : E_NotFoundSymbol = &h80041006
Dim E_ProgRetNotZero : E_ProgRetNotZero = &h80041007
Dim E_Unexpected : E_Unexpected = &h80041008
Dim E_WIN32_FILE_NOT_FOUND: E_WIN32_FILE_NOT_FOUND = &h80070002
Dim E_WIN32_DIRECTORY : E_WIN32_DIRECTORY = &h8007010B
Dim E_ProgTerminated : E_ProgTerminated = &hC0000005
Dim E_BadType : E_BadType = 13
Dim E_FileNotExist : E_FileNotExist = 53
Dim E_EndOfFile : E_EndOfFile = 62
Dim E_WriteAccessDenied : E_WriteAccessDenied = 70
Dim E_ReadAccessDenied : E_ReadAccessDenied = 70
Dim E_PathNotFound : E_PathNotFound = 76
Dim E_AlreadyExist : E_AlreadyExist = 58
(src)
関連
→ Windows エラーコード
←
▼
▲
が呼ばれないで、スクリプトが終了しました。
または
〜 TryEnd でエラー処理するときの最後に必要な
を設定して、エラーが発生した場所でブレークして、コールスタックを参照
して、TryStart 〜 TryEnd のエラー処理に、Err2::Clear または Err2::Raise を記述してください。
<ERROR msg="Script finished before Err2.Clear or Raise the error"
jp="エラー処理の途中で終了しました。Err2.Clear または再 Raise してください"
err_symbol="E_NotClear" />
エラーメッセージ:
VBScript global code (メインvbs の vbslib include)
ResumePop
CallFinalizeInModules
(= g_FinalizeModules(i))
FinalizeModule (vbslib.vbs)
Err2.OnSuccessFinish
echo GetErrStr( num, Description )
0
←
▼
▲
<ERROR msg="Out of Diff"
src=
"C:\folder\file1.txt"
dst=
"C:\folder"
/>
<ERROR
ログを検索する時は、"<ERROR " で検索すると、すぐに見つかります。
msg
自然言語のエラーメッセージ
src, dst など
値がパスのときは、タグジャンプができるように新しい行から値を書く。
関連
XML を使って、エラー情報を構造化します。
もしエラー情報の一部を取得したいときは、エラーメッセージ(Err2.Description) を
に渡してください。 参考
<ERROR msg="シンボルが見つかりません" path="SymbolA"/>
←
▼
▲
Sub Error()
簡易的にその他のエラーを発生させます。
コーディングが最も楽なエラー発生です。 その代わり、エラーの内容はユーザに
伝わりません。 cscript.exe のエラーレベルは 1 になります。
エラー値を返す API やライブラリは、少なくとも、正常に処理されたことを示す値
でなかったら、本関数を呼び出して、緊急停止させます。
想定済みのエラーであれば、ユーザがエラーに対応できるように、Raise などを
使ってエラー処理を実装してください。
想定外のエラーや開発者が発生させたことがないエラーは、本関数を呼び出して、
緊急停止させます。
(src)
関連
エラーを発生させる。
←
▼
▲
Sub Raise( e_num as integer, e_desc as string )
新規にエラーを発生させます。
Raise 1, "ファイルが見つかりません c:\a.txt"
サンプル:
【引数】
e_num
e_desc
参考
エラーメッセージ
(src)
関連
簡単に実装できるエラー発生
標準形式のエラーメッセージを返す。
条件が満たされているかをチェックします。
←
▼
▲
Function GetErrStr( e_num as integer, e_desc as string ) as string
標準形式のエラーメッセージを返す。
【引数】
e_num
e_desc
エラーコード
エラーメッセージ
(src)
サンプル:
関連
Dim e ' as Err2
echo_v GetErrStr( e.num, e.desc )
エラーメッセージの例:
<ERROR err_number='500' err_description='この変数は宣言されていません。'/>
←
▼
▲
Function TryStart( e as Err2 ) as boolean
Try ブロックの開始に記述します。
On Error Resume Next を呼び出すべきかどうかを判定します。
(src)
参考
ほとんどの場合、1つ目のエラーを対処することで、2つ目のエラーは発生しなくなるため、
2つ目のエラーが発生して、1つ目のエラーの情報が上書きされて消えてしまうことが
ないようにすることが重要です。
エラーが発生(1)
TryStart
TryEnd
エラーが発生(2)
← このエラーが前のエラーの情報を消してしまう
処理
TryEnd
TryStart
← Err2::Clear していない
エラーにしている理由
対処方法
エラーメッセージに表示されているように、g_debug 変数などの値を設定し、エラーが
発生している場所、つまり、TryStart の中の Stop 命令でブレークさせます。
1.
Err.Number が 0 以外なら、Err.Description の値を、e.num が 0 以外なら e.desc の
Err2::desc の値を表示させて、1つ前のエラーの内容を確認します。
2.
なお、多くの場合、TryStart を使わない On Error Resume Next によって、そこで
発生したエラーでブレークすることができなくなっています。
コールスタックを上にたどっていき、On Error Resume Next が無いか探します。
あったら、おそらく、そこで1つ前のエラーが発生しているので、そのエラーを発生
させなくするか、クリアすることで対処してください。
3.
VBScript の不具合に対する対処
Class_Initialize か Class_Terminate で発生したエラーは、VBScript は投げられま
せん(エラーによる中断をしません)。
を呼び出してください。
または
←
▼
▲
Function TryEnd() as boolean
Try ブロックの終了に記述します。
On Error GoTo 0 を呼び出すべきかどうかを判定します。
参考
(src)
←
▼
▲
Function Trying() as boolean
Try ブロックの中で記述します。
エラーが発生していたら False を返します。
参考
(src)
←
▼
▲
(src)
Sub ErrCheck()
これまでの処理で、エラーがあったかどうかをチェックして、エラーがあったら発生させます。
クラスの Class_Initialize メソッドの中でエラーが発生しても、VBScript は、続きを実行してしまい、
エラーを見つけるのが困難になります。 new でオブジェクトを生成したら、本関数を呼び出して
ください。
サンプル:
Set obj = new ClassA : ErrCheck
→ テスト [T_ErrOnNew] コンストラクタで発生したエラーを検出
キーワード:
テスト
関連
←
▼
▲
Sub ErrorCheckInTerminate( ErrNumAtStart as integer )
クラスの Class_Terminate の中で発生したエラーを表示します。
エラーが発生していたら、Err オブジェクトの内容を echo 出力して Stop または pause します。
エラーが発生していなかったら(Err.Number = 0 なら)、何もしません。
Class_Terminate の中でエラーを発生させることはできないので、ErrorCheckInTerminateも
エラーを発生させません。
Private Sub Class_Terminate()
Dim en,ed : en = Err.Number : ed = Err.Description
On Error Resume Next '// This clears error
If en=0 or en=21 Then
Else
del Me.TmpDstPath
End If
ErrorCheckInTerminate en
On Error GoTo 0 : If en <> 0 Then Err.Raise en,,ed '// This sets en again
End Sub
サンプル:
(src)
参考
【引数】
ErrNumAtStart
Class_Terminate に入った直後のエラーコード
ErrorCheckInTerminate
→ T_Finish.vbs # ErrorCheckInTerminate
テスト
On Error Resume Next '// This clears error
If g_count_up(0)=0 Then Stop
echo "g_count(0)=" & g_count(0) '// watch-> g_count [DEBUGGING]
If g_count(0) = 99 Then On Error GoTo 0
エラーが発生したときに対処法
Class_Terminate の中で発生したエラーでブレークさせる方法を説明します。
On Error Resume Next の後に、下記のコードを記述してください。
一度実行したら、最後の行の 99 を g_count(0) の値に変更して再度実行してください。
0
0
0
0
99
参考