私は試行次のコードです:
Try ' DOESN'T WORK
Throw 2 ' How do I throw an exception?
Catch ex
'What do I do here?
End Try
しかし、私はエラーを取得していますStatement expected
キャッチ節内。
VBScriptで例外をキャッチ/スローする方法を知っている人はいますかtry/catchを使用して? (私はnotでソリューションを探していますOn Error Do X
。)
VBScriptにはTry/Catchがありません。 ( VBScript言語リファレンス 。Tryがあった場合は、Statementsセクションにリストされます。)
On Error Resume Next
はVBScriptでの唯一のエラー処理です。ごめんなさい。 try/catchが必要な場合は、JScriptがオプションです。 VBScriptがどこでもサポートされており、同じ機能を備えています。
VBScriptでは、_On Error Resume Next
_を使用する一種の「古いスタイル」のエラー処理を利用できます。まず、それを有効にします(多くの場合、ファイルの先頭で使用しますが、の代わりに最初の_Err.Clear
_を組み合わせて使用することもできます)、次にエラーの可能性を実行する前に-コードを生成し、既に発生したエラーをクリアし、エラーを生成する可能性のあるコードを実行してから、明示的にエラーをチェックします。
_On Error Resume Next
' ...
' Other Code Here (that may have raised an Error)
' ...
Err.Clear ' Clear any possible Error that previous code raised
Set myObj = CreateObject("SomeKindOfClassThatDoesNotExist")
If Err.Number <> 0 Then
WScript.Echo "Error: " & Err.Number
WScript.Echo "Error (Hex): " & Hex(Err.Number)
WScript.Echo "Source: " & Err.Source
WScript.Echo "Description: " & Err.Description
Err.Clear ' Clear the Error
End If
On Error Goto 0 ' Don't resume on Error
WScript.Echo "This text will always print."
_
上記では、エラーが発生した場合に出力するだけです。エラーがスクリプトにとって致命的である場合、2番目の_Err.clear
_をWScript.Quit(Err.Number)
に置き換えることができます。
また、エラーが発生したときに次のステートメントで実行を再開することをオフにする_On Error Goto 0
_にも注意してください。
Set
が成功したときの動作をテストする場合は、先に進んでその行をコメントアウトするか、_vbscript.regexp
_などの成功するオブジェクトを作成します。
_On Error
_ディレクティブは、現在実行中のスコープ(現在のSub
またはFunction
)のみに影響し、呼び出し元または呼び出し先のスコープには影響しません。
何らかの状態を確認してから、関数を呼び出すコードで処理されるエラーを発生させる場合は、_Err.Raise
_を使用します。 _Err.Raise
_は、Number
、Source
、Description
、HelpFile
、およびHelpContext
の5つの引数を取ります。ヘルプファイルとコンテキストの使用は、このテキストの範囲外です。 Number
は選択したエラー番号、Source
はエラーを発生させているアプリケーション/クラス/オブジェクト/プロパティの名前、Description
はエラーの簡単な説明です。発生したエラー。
_If MyValue <> 42 Then
Err.Raise(42, "HitchhikerMatrix", "There is no spoon!")
End If
_
次に、上で説明したように、発生したエラーを処理できます。
ログの変更
Err.Clear
_を追加して、無視された可能性のある以前のエラーをすべて消去するようにしました。On Error Resume Next
_と_Err.Clear
_の間により多くのコードが予想されることを明確にしました。一部の文法を修正し、扱いにくくしました。 _Err.Raise
_に関する情報を追加しました。フォーマット。VBScriptの回避策でキャッチexistsを試してください。
Class CFunc1
Private Sub Class_Initialize
WScript.Echo "Starting"
Dim i : i = 65535 ^ 65535
MsgBox "Should not see this"
End Sub
Private Sub CatchErr
If Err.Number = 0 Then Exit Sub
Select Case Err.Number
Case 6 WScript.Echo "Overflow handled!"
Case Else WScript.Echo "Unhandled error " & Err.Number & " occurred."
End Select
Err.Clear
End Sub
Private Sub Class_Terminate
CatchErr
WScript.Echo "Exiting"
End Sub
End Class
Dim Func1 : Set Func1 = New CFunc1 : Set Func1 = Nothing
場合によっては、特にVBを使用している場合、明らかな解決策を見逃す可能性があります。私が最後の2日間やっていたように。
エラーを生成するコードは、別の関数に移動する必要があります。そして、関数の最初にOn Error Resume Next
。これは、他のエラーを飲み込むことなく、エラーを「飲み込む」ことができる方法です。コードを小さな個別の関数に分割すると、読みやすさやリファクタリングが改善され、新しい機能を簡単に追加できるようになります。