VBScript —エラー処理の使用


84

VBScriptを使用してエラーをキャッチし、ログに記録して(つまり、エラーが発生した場合は「何かをログに記録」)、スクリプトの次の行を再開したいと思います。

例えば、

エラー時に次を再開
'ステップ1を実行します
'ステップ2を実行します
'ステップ3を実行します

手順1でエラーが発生した場合、そのエラーをログに記録して(または、他のカスタム機能を実行して)、手順2から再開します。これは可能ですか?どうすればそれを実装できますか?

編集:私はこのようなことをすることができますか?

エラー時にmyErrCatchを再開します
'ステップ1を実行します
'ステップ2を実行します
'ステップ3を実行します

myErrCatch:
'ログエラー
次を再開

1
Dylanの応答は、VBがエラー処理部門で取得するのとほぼ同じです。これが、私がそれを回避できるときに常にJavascriptを使用した理由です。
wcm 2008年

回答:


161

VBScriptには、例外をスローまたはキャッチするという概念はありませんが、ランタイムは、最後に実行された操作の結果を含むグローバルErrオブジェクトを提供します。各操作の後で、Err.Numberプロパティがゼロ以外であるかどうかを明示的に確認する必要があります。

On Error Resume Next

DoStep1

If Err.Number <> 0 Then
  WScript.Echo "Error in DoStep1: " & Err.Description
  Err.Clear
End If

DoStep2

If Err.Number <> 0 Then
  WScript.Echo "Error in DoStop2:" & Err.Description
  Err.Clear
End If

'If you no longer want to continue following an error after that block's completed,
'call this.
On Error Goto 0

「OnErrorGoto [label]」構文は、VisualBasicおよびVisualBasic for Applications(VBA)でサポートされていますが、VBScriptはこの言語機能をサポートしていないため、上記のようにOn Error ResumeNextを使用する必要があります。


3
あなたは、などターン終了アプリケーションでは、エラーを記録可能性が関数またはサブ、呼び出すためにif文の中にWscript.Echoステートメントを変更することができます
StormPooper

「最後に実行された操作の結果が含まれています」。本当?大きな違いである最後のエラーが発生するようです。
ダミアンゴールディング2014年

err.clearオブジェクトの各チェックの後に使用する必要があることをMSのドキュメントが示唆しているにもかかわらず、前のエラーが次のチェック(technet.microsoft.com/en-us/library/ee692852.aspxなど)をトリップするのを防ぐために、私の経験でerrはクリアされていますスクリプトが進むにつれて、「それ自体で」。さらにテストすることなく、私の推測では、オブジェクトクリアerrを内部操作の副産物として利用しています。
user66001 2014

@ user66001同意しましたが、明示的に呼び出す方が安全Err.Clearです。
Lankymart 2015年

12

これOn Error Resume Nextはグローバルに設定されていないことに注意してください。コードの安全でない部分を関数に入れることができます。たとえば、エラーが発生するとすぐに中断され、前例のOERNステートメントを含むサブからこの関数を呼び出すことができます。

ErrCatch()

Sub ErrCatch()
    Dim Res, CurrentStep

    On Error Resume Next

    Res = UnSafeCode(20, CurrentStep)
    MsgBox "ErrStep " & CurrentStep & vbCrLf & Err.Description

End Sub

Function UnSafeCode(Arg, ErrStep)

    ErrStep = 1
    UnSafeCode = 1 / (Arg - 10)

    ErrStep = 2
    UnSafeCode = 1 / (Arg - 20)

    ErrStep = 3
    UnSafeCode = 1 / (Arg - 30)

    ErrStep = 0
End Function

1
私が今まで見た中で最も明確な例ではありませんが、私はその概念を理解しています。
Lankymart 2015年

7
@Lankymartは、そのとき見たより明確な例をリンクしていただけませんか、または代わりにomegastripesがこの例をどのように改善できるかを提案しますか?
ドミニク2016

3
一瞬、「omegastripes」と呼ばれる新しいソフトウェアエンジニアリングパラダイムを見逃したという印象を受けました。笑
TheBlastOne 2016

4

ファサード関数でステップ関数呼び出しを再グループ化できます。

sub facade()
    call step1()
    call step2()
    call step3()
    call step4()
    call step5()
end sub

次に、エラー処理をファサードを呼び出す上位関数に入れます。

sub main()
    On error resume next

    call facade()

    If Err.Number <> 0 Then
        ' MsgBox or whatever. You may want to display or log your error there
        msgbox Err.Description
        Err.Clear
    End If

    On Error Goto 0
end sub

ここでstep3()、エラーが発生したとしましょう。以来facade()(存在しないエラーを処理しませんなし On error resume nextfacade())、エラーがに返送されますmain()step4()してstep5()実行されません。

エラー処理が1つのコードブロックでリファクタリングされるようになりました


1

私はVBScriptに非常に慣れていないので、これはベストプラクティスとは見なされないか、まだ気付いていない方法でこれを行うべきではない理由があるかもしれませんが、これは私がトリミングするために思いついた解決策ですメインコードブロックのエラーログコードの量を減らします。

Dim oConn, connStr
Set oConn = Server.CreateObject("ADODB.Connection")
connStr = "Provider=SQLOLEDB;Server=XX;UID=XX;PWD=XX;Databse=XX"

ON ERROR RESUME NEXT

oConn.Open connStr
If err.Number <> 0 Then : showError() : End If


Sub ShowError()

    'You could write the error details to the console...
    errDetail = "<script>" & _
    "console.log('Description: " & err.Description & "');" & _
    "console.log('Error number: " & err.Number & "');" & _
    "console.log('Error source: " & err.Source & "');" & _
    "</script>"

    Response.Write(errDetail)       

    '...you could display the error info directly in the page...
    Response.Write("Error Description: " & err.Description)
    Response.Write("Error Source: " & err.Source)
    Response.Write("Error Number: " & err.Number)

    '...or you could execute additional code when an error is thrown...
    'Insert error handling code here

    err.clear
End Sub

1
これはASPクラシックではなく、昔ながらのVBScriptである
Jobbo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.