测试对象是否为Nothing会导致“需要对象”错误。

10

我在支持一些经典的ASP页面,其中一个页面使用并重复使用名为 conn 的对象,并在.asp页面完成处理时或在页面重定向到另一页之前将其处理掉。

<%
dim conn
...
set conn = server.CreateObject("adodb.connection")
...
sub cleanUp()
    conn.Close
    set conn = nothing
end sub
...
sub pageRedirect(url)
    call cleanUp()
    response.Redirect url : response.End
end sub
...
' very end of file
call cleanUp()%>

我发现如果有重定向,那么在conn.Close这一行就会出现服务器错误,Microsoft VBScript运行时错误'800a01a8',需要对象。我认为这行代码不应该执行多次,但为了安全起见,我重新编写了这个函数。

sub cleanUp()
    if(not (conn Is Nothing)) then
        conn.Close
        set conn = Nothing
    end if
end sub

但是我仍然遇到了完全相同的错误,现在出现在这一行:if(not (conn Is Nothing))!!我以为Is Nothing的目的是在使用变量名conn之前做一个测试,以精确地防止那个“需要对象”错误,但是这个测试却抛出了相同的错误。

我可以使用什么其他测试来确保在已经将其设置为Nothing的情况下不引用conn?


在编程中,将以下内容从英语翻译成中文:在**if条件后面加上空格,即"if (not ("**。 - Siva Charan
Empty 用于值变量,Nothing 用于对象。conn 是一个对象。而且空格无关紧要。 - East of Nowhere
3个回答

17

is nothing 用于测试对象引用,如果变量不包含这样的引用,则测试无效并引发错误,因此只有在将 conn 设置为某些内容之后才能对其进行测试。

您可以:

if isobject(conn) then
   if not (conn Is Nothing) then set conn = nothing
end if

1
谢谢,这对我有用。在声明后立即将我的对象设置为“nothing”也是一个好主意。 - East of Nowhere

3
  1. 使用option explicit(每次运行脚本时,如果没有使用option explicit,就会有一只小狗死亡),你可能会更早地发现问题,就像Nilpo所提到的那样。
  2. 当你定义一个变量作为对象引用并将其测试为Nothing时,在初始化时把它设置为Nothing成为一个习惯(*): dim myObject : Set myObject = Nothing

(*) 不是真正的初始化,因为dim在程序开始前处理,但当你把所有的dim都放在一个程序的顶部时,它实际上是一样的。


-1
使用IsNothing函数。您还应该检查它是否为对象。
sub cleanUp()
    if Not IsNothing(conn) then
        if IsObject(conn) then
            conn.Close
        end if
        set conn = nothing
    end if
end sub

说实话,我会这样做,因为将变量设置为空没有任何影响。
sub cleanUp()
    if IsObject(conn) then
        conn.Close
    end if
    set conn = nothing
end sub

更重要的是,你的问题在于你的子程序中没有conn。你应该将它作为参数传递进去。

IsNothing 函数有参考文献吗? - user69820
1
没有 IsNothing 函数。您必须在语句中使用 Is Nothing,例如:if obj Is Nothing then ' do stuff end if - mikeyq6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接