0

通常のURLからtinyurlを作成するvbscript関数があります。

FUNCTION GetShortURL(strUrl)
  Dim oXml,strTinyUrl,strReturnVal
  strTinyUrl = "http://tinyurl.com/api-create.php?url=" & strUrl
  set oXml = Server.CreateObject("Msxml2.ServerXMLHTTP.3.0")
  oXml.Open "GET", strTinyUrl, false
  oXml.Send
  strReturnVal = oXml.responseText
  Set oXml = nothing
  GetShortURL = strReturnVal
END FUNCTION

tinyurl apiがダウンしているかアクセスできないときに問題が発生し、スクリプトが失敗します。

msxml3.dllエラー「80072efe」サーバーとの接続が異常終了しました

エラーを防ぎ、長いURLを使用するために、この関数に追加できるセーフガードはありますか?

よろしくお願いします。

ネオジャキー

4

2 に答える 2

1

strUrl通話が失敗した場合にのみ戻りたい場合は、 On ErrorResumeNextを使用できます。

FUNCTION GetShortURL(strUrl)
  on error resume next
  Dim oXml,strTinyUrl,strReturnVal
  strTinyUrl = "http://tinyurl.com/api-create.php?url=" & strUrl
  set oXml = Server.CreateObject("Msxml2.ServerXMLHTTP.3.0")
  oXml.Open "GET", strTinyUrl, false
  oXml.Send
  strReturnVal = oXml.responseText
  Set oXml = nothing
  'Check if an error occurred.
  if err.number = 0 then
     GetShortURL = strReturnVal
  else
     GetShortURL = strUrl
  end if
END FUNCTION
于 2012-11-20T20:51:38.860 に答える
0

明らかに、何らかのエラー処理が必要です。一般に、VBScriptのエラー処理は面白くありませんが、仕様に応じて、問題が発生した場合に適切なものまたはデフォルトを取得します。問題が発生した場合は、適切で単純なアプローチを使用できます。

元の関数をに減らします

  1. 関数名へのデフォルト値の割り当て(失敗に備えるため)
  2. 次のエラー再開時(VBScriptのデフォルトのエラー処理、つまりクラッシュを無効にするため)
  3. ヘルパー関数の戻り値の関数名への割り当て(成功に備えるため)

コード内:

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

それが私が「面白くない」と言ったときの意味です。危険なコードを関数に入れることで、この面倒を避けることができます。

于 2012-11-20T20:51:51.310 に答える