【问题标题】:Properties missing from ASP/VBScript error objectASP/VBScript 错误对象中缺少属性
【发布时间】:2019-10-28 18:46:19
【问题描述】:

这与另一个问题相同,因为另一个问题中的建议对我不起作用。我特别想确定在我的情况下这不起作用的不同之处。

我正在使用经典 ASP。根据我在网上找到的文档(此处和其他地方:https://www.w3schools.com/ASp/asp_ref_error.asp),ASP 错误对象应具有以下属性,其中包括:

  • 描述:返回错误的简短描述
  • 文件:返回产生错误的 ASP 文件的名称
  • 行:返回检测到错误的行号
  • 数字:返回错误的标准 COM 错误代码

我有以下测试代码。注意error_log() 是一个将文本写入日志文件的自定义函数。

on error resume next
    blah
    if err.number > 0 then
        error_log( err.number )
        error_log( err.description )
        error_log( err.file )
        error_log( err.line )
    end if
on error goto 0

前两行numberdescription按预期写入;但fileline 不是。据我所知,后两个属性根本不适用于我的 ASP/VBScript 副本。为什么我没有这些属性?

我正在运行我认为是最新(大约 2000 年)版本的经典 ASP VBScript。直言不讳:VBScript 5.8 build 16384

编辑:尝试运行 Server.GetLastError() 失败。由于某种原因,我似乎没有该命令。 [更正:它运行但似乎没有数据。请参阅下面的示例]

新的最小示例:

On Error Resume Next
    blah    'This is our error. unrecognized variable'
    Set error = Server.GetLastError()
    response.write error.file
On Error Goto 0
response.end

这会导致空白屏幕。没有写入错误数据。

另一个测试。注意“错误”与自动生成的“错误”:

On Error Resume Next
    blah    'This is our error. unrecognized variable'
    Set error = Server.GetLastError()
    response.write error.number
    response.write " | "
    response.write err.number
    response.write "<br>" & vbCrLf
    response.write error.description
    response.write " | "
    response.write err.description
    response.write "<br>" & vbCrLf
    response.write error.file
    response.write " | "
    response.write error.line
On Error Goto 0
response.end

结果:

0 | 500
| Variable is undefined
| 0

【问题讨论】:

  • 在处理经典 ASP 时使用Server.GetLastError()。 VBScript Err 对象与ASPError 对象不同。
  • 没有骰子。不确定我是否正确使用了 server.getlasterror。我只是将它设置为一个变量吗? Set err = Server.GetLastError() 然后打电话给err.file 还是什么? Server.GetLastError() 似乎失败了
  • 根据您的具体措辞,我发现了这一点,这有助于:vbsedit.com/html/aebd3a6c-e8a9-4394-9efb-d15c6b92ceb7.asp 但是... 没有办法 获取发生错误的文件或行?
  • “似乎失败了” - 这应该有什么帮助?它是如何失败的,你得到一个语法错误是对象只是空的吗?什么?

标签: asp-classic


【解决方案1】:

对于初学者,每个用户 Lankymart,自动 err 对象和 Server.GetLastError() 返回的对象之间存在差异。为此,我们需要两者中的后者。

似乎 Classic ASP 返回的错误代码略有不同:500.100;所以如果你想捕获错误数据,你必须为那个子代码显式地创建一个错误页面。

在此处找到信息:https://stackoverflow.com/a/9407559/339440

如果有脚本,经典 ASP 总是返回 500.100 状态 错误[...]。

如果您想捕捉经典 ASP 脚本错误并能够阅读 自定义错误页面中的 Server.GetLastError() 对象(例如 记录)您需要专门为 500.100 提供处理程序。

如果您不指定自定义 500.100 错误,那么 IIS 将回退到 您的自定义(或它自己的)500 错误页面但 Server.GetLastError() 不会提供有关错误的任何有用信息

所以错误引用“就地”不起作用,捕获标准 500 错误也不起作用。您需要明确捕获 500.100 代码。在常规的 500 错误中,Server.GetLastError() 返回一个没有数据的对象——这正是我遇到的问题。

所以我复制了我网站的 500 错误页面,并将其修改为也写入我的错误日志。然后在 IIS 中,我将该新文件设置为 500.100 错误的错误页面。它似乎正在工作。

这并没有完全解决我的问题,因为我试图创建一种可以内联运行的try ... catch 例程。但它确实让我能够简单地记录错误,这非常有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 2023-03-14
    • 2019-10-30
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    相关资源
    最近更新 更多