明らかに、何らかのエラー処理が必要です。一般に、VBScriptのエラー処理は面白くありませんが、仕様に応じて、問題が発生した場合に適切なものまたはデフォルトを取得します。問題が発生した場合は、適切で単純なアプローチを使用できます。
元の関数をに減らします
- 関数名へのデフォルト値の割り当て(失敗に備えるため)
- 次のエラー再開時(VBScriptのデフォルトのエラー処理、つまりクラッシュを無効にするため)
- ヘルパー関数の戻り値の関数名への割り当て(成功に備えるため)
コード内:
Function GetShortURL2(strUrl)
GetShortURL2 = strUrl
On Error Resume Next
GetShortURL2 = [_getshorturl](GetShortURL2)
End Function
_getshorturl()を直接呼び出さないことを強調したいので、[]を使用して「不正な」関数名を使用できるようにします。_getshorturl()でエラーが発生すると、割り当てがスキップされ、次の行で再開されます(関数を終了し、デフォルトに戻り、デフォルトのエラー処理にリセットされます)。
ヘルパー関数には、元の関数の「重要な部分」が含まれています。
Function [_getshorturl](strUrl)
Dim oXml : Set oXml = CreateObject("Msxml2.ServerXMLHTTP.3.0")
oXml.Open "GET", "http://tinyurl.com/api-create.php?url=" & strUrl, False
oXml.Send
[_getshorturl] = oXml.responseText
End Function
どの操作が失敗しても、プログラムフローはGetShortURL2()の「EndFunction」行で再開されます。
追加:それを行う通常の方法に関するコメント(Daniel Cookの提案を参照)
エラー処理をオフにすると(そして「OnError Resume Next」はまさにそれです)、あなたは薄い氷の上にいます。あなたが調整したエラーだけでなく、すべてのエラーが隠されています。スクリプトは、必要な前提条件が与えられているか、準備が行われているかに関係なく、すべての次の行でアクションを実行します。
したがって、スコープを1つの危険な行に制限する必要があります。
Dim aErr
...
On Error Resume Next
SomeRiskyAction
aErr = Array(Err.Number, Err.Description, Err.Source)
On Error Goto 0
If aErr(0) Then
deal with error
Else
normal flow
End If
または、OERNスコープの各行の後で確認します
On Error Resume Next
SomeRiskyAction1
If Err.Number Then
deal with error
Else
SomeRiskyAction2
If Err.Number Then
deal with error
Else
...
End If
End If
それが私が「面白くない」と言ったときの意味です。危険なコードを関数に入れることで、この面倒を避けることができます。