【问题标题】:Check if Connection is OK in Classic ASP检查经典 ASP 中的连接是否正常
【发布时间】:2015-10-21 19:13:02
【问题描述】:

有没有简单的方法可以检查一个连接字符串是否成功连接到指定的数据库:

场景:

连接字符串示例:

ConnString="DRIVER={MySQL ODBC 5.1 Driver}; SERVER=###.###.####.##; PORT=3306; DATABASE=DbName; USER=DbUser; PASSWORD=DbUser_Pswrd; OPTION=3;"

如果上述失败,例如登录,因为 MySQL 服务器当前处于脱机状态,或者有什么简单的方法可以检查是否存在问题,而不是如下所述抛出一般错误 80004005?

解决方案是解决上述页面加载时抛出的错误,其中代码中的以下行导致错误,因为连接无法连接到数据库:

rs.ActiveConnection = connString

我想在读取上述行之前捕获此连接问题,以便我可以重定向到没有连接字符串的页面并显示一条消息,说明服务器当前处于脱机状态等。

我只需要捕获错误代码。

【问题讨论】:

  • On Error Resume Next 然后在If Err.Number <> 0 Then ... End If 行之后捕获错误。
  • 'on error' 是否捕获 vbscript 中的任何错误事件?
  • No On Error Resume Next 没有捕捉到它实际上只是忽略了导致错误的行,而是将 Err 对象 Number 属性设置为抛出的错误代码。这样您就可以在使用If Err.Number <> 0 Then 后直接进行检查。如果您没有在预期出错的行之后直接检查,则可能会发生其他错误,并且不会为 Err 对象提供预期的代码。要停止忽略错误,只需调用 On Error Goto 0
  • 感谢您的帮助。您的意见帮助我解决了我的问题。欣赏它

标签: mysql vbscript asp-classic adodb


【解决方案1】:

VBScript 错误处理

在 VBScript 中捕获错误的方法是使用 VBScript Runtime 中内置的 On Error Resume Next 语句和 Err 对象。

Err 对象是什么?

Err 对象用于包含有关在运行时引发的错误的信息,它始终包含引发的最后一个错误,并在引发更多错误时不断覆盖自身。

当出现错误时会停止执行,那么Err 的意义何在?

这是因为默认情况下错误会停止脚本执行。然而,VBScript 提供了一种机制来忽略这些错误并通过移动到下一个可执行行并填充Err 对象来继续执行。为此,我们在希望执行忽略运行时错误的位置放置 On Error Resume Next 语句。

请务必记住,On Error Resume Next 只会忽略运行时错误。编译错误和语法错误仍然会停止脚本的执行。

所以我正在使用On Error Resume Next 我如何捕获错误?

使用If 语句,一旦引发错误,Err 对象将填充该错误并可以被查询。

On Error Resume Next
'Line we are checking for error. When an error occurs execution will 
'move to the next line, in this case the If Err.Number <> 0 Then.
rs.ActiveConnection = connString
If Err.Number <> 0 Then
  'Raise a custom error, output error to screen or perform some action.
  'Remember to clear the Err object before continuing.
  Err.Clear
End If
'We no longer want to ignore errors
On Error Goto 0

放置On Error Resume Next 语句会重置Err 对象,就像调用了Err.Clear 方法一样。

经典 ASP 中的常见用法

  • 有时您可能希望检测特定错误并返回更友好的自定义响应,最简单的方法是从 If Err.Number &lt;&gt; 0 Then 语句构建响应。

    If Err.Number <> 0 Then
      Response.Write "Error (" & Err.Number & ") occurred: " & Err.Description
    End If
    
  • 一种更复杂的方法是提出您自己的错误,然后其他人可以在执行树的更上方捕获该错误(取决于您的 Web 应用程序的复杂性)

    Err.Raise vbObjectError + 1, "My Custom App", "Connection not detected"
    
  • 您可能还想捕获可以通过使用ArrayScripting.Dictionary 对象而不是立即输出错误来完成的错误列表。

    Dim errors(), error_count
    Dim err_obj
    ...
    'This block could be repeated throughout the code for various
    'error checks.
    If Err.Number <> 0 Then
      ReDim Preserve errors(error_count)
      errors(error_count) = Array(Err.Number, Err.Description)
      error_count = error_count + 1
    End If
    ...
    'Output errors
    If IsArray(errors) Then
      Response.Write "<p>" & error_count & " error(s) have been detected</p>"
      Response.Write "<ol>"
      For Each err_obj In errors
        Response.Write "<li>Error: " & err_obj(0) & " - " & err_obj(1) & "</li>"
      Next
      Response.Write "</ol>"
    End If
    
  • 检测可以使用Select 语句而不是使用经典的If 语句方法返回的各种错误代码,就像这样;

    Select Case Hex(Err.Number)
    Case &H800A0006
      'Overflow error
    Case &H800A000B
      'Division by zero error
    Case Else
      'Anything else
    End Select
    

有用的链接

【讨论】:

    【解决方案2】:

    您将在这里使用on error resume next,它基本上告诉您的脚本在抛出错误时跳过一行并从下一行继续,通过检查err.number是否不等于0,您可以捕获错误并从那里做任何你想做的事情。我建议您在使用 on error goto 0 完成后“禁用”on error resume next,因为在整个代码中“启用”它可能会导致一些不良结果。

    以下是您的代码外观的简单示例:

    err.clear
    on error resume next
    rs.ActiveConnection = connString
    if err.number<>0 then
        '## do whatever you want here
    end if
    on error goto 0
    

    【讨论】:

    • 另外Err.Clear 也不是必需的,因为调用On Error Resume Next 会重置Err 对象,但你应该已经知道了。
    • Shaggy 插手别人的荣耀肯定有点粗鲁。
    猜你喜欢
    • 1970-01-01
    • 2015-05-19
    • 2023-03-12
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多