web-dev-qa-db-ja.com

VBScriptのTry-Catch-End Tryが機能しないようです

私は試行次のコードです:

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。)

33
Mehrdad

VBScriptにはTry/Catchがありません。 ( VBScript言語リファレンス 。Tryがあった場合は、Statementsセクションにリストされます。)

On Error Resume NextはVBScriptでの唯一のエラー処理です。ごめんなさい。 try/catchが必要な場合は、JScriptがオプションです。 VBScriptがどこでもサポートされており、同じ機能を備えています。

19
Tmdean

エラー処理

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_は、NumberSourceDescriptionHelpFile、およびHelpContextの5つの引数を取ります。ヘルプファイルとコンテキストの使用は、このテキストの範囲外です。 Numberは選択したエラー番号、Sourceはエラーを発生させているアプリケーション/クラス/オブジェクト/プロパティの名前、Descriptionはエラーの簡単な説明です。発生したエラー。

_If MyValue <> 42 Then
    Err.Raise(42, "HitchhikerMatrix", "There is no spoon!")
End If
_

次に、上で説明したように、発生したエラーを処理できます。


ログの変更

  • 編集#1:エラーが発生する可能性のある行の前に_Err.Clear_を追加して、無視された可能性のある以前のエラーをすべて消去するようにしました。
  • 編集#2:明確化。
  • 編集#3:コードブロックにコメントを追加しました。 _On Error Resume Next_と_Err.Clear_の間により多くのコードが予想されることを明確にしました。一部の文法を修正し、扱いにくくしました。 _Err.Raise_に関する情報を追加しました。フォーマット。
  • 68
    Mark Ribau

    VBScriptの回避策でキャッチexistsを試してください。

    http://web.archive.org/web/20140221063207/http://my.opera.com/Lee_Harvey/blog/2007/04/21/try-catch-finally-in-vbscript-sure

    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
    
    3
    AngelicCare

    場合によっては、特にVBを使用している場合、明らかな解決策を見逃す可能性があります。私が最後の2日間やっていたように。

    エラーを生成するコードは、別の関数に移動する必要があります。そして、関数の最初にOn Error Resume Next。これは、他のエラーを飲み込むことなく、エラーを「飲み込む」ことができる方法です。コードを小さな個別の関数に分割すると、読みやすさやリファクタリングが改善され、新しい機能を簡単に追加できるようになります。

    0
    Vital