ASP/VBScript 错误对象中缺少属性

Properties missing from ASP/VBScript error object

This is not the same as the other question because the advice in the other question fails to work for me. I'm specifically trying to determine what's different in my case that this doesn't work.

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

我有以下测试代码。注意 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 副本根本不可用。为什么我没有这些属性?

我正在 运行我认为是经典 ASP VBScript 的最新(大约 2000 年)版本。直接来自马口:VBScript 5.8 build 16384

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

新的最小示例:

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

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

另一个测试。注意 "error" 与自动生成的 "err":

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

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

似乎Classic ASP returns 略有不同的错误代码:500.100;所以如果你想捕获错误数据,你必须为该子代码明确地制作一个错误页面。

在此处找到的信息:

Classic ASP has always returned a 500.100 status if there is a script error[...].

If you want to catch Classic ASP script errors and be able to read the Server.GetLastError() object in your custom error page (say for logging) you need to provide a handler specifically for 500.100.

If you don't specify a custom 500.100 error then IIS will fall back to your custom (or its own) 500 error page but Server.GetLastError() won't provide any useful information about the error.

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

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

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