控制经典ASP中的空数组

时间:2012-10-10 15:33:28

标签: asp-classic

好的,我是ASP的完全新手。

我有一个不同内容加载的客户端,具体取决于数组中传递的内容。

select case lcase(arURL(4))

有时候,arURL(4)可能是空的,在这种情况下,我收到以下错误:

运行函数functionName()时出错,错误是:

  

下标超出范围

有人知道解决这个问题的方法吗?

由于

按要求确定更多代码。这是一个可怕的代码,我不是故意让任何人头疼,所以请原谅。再次感谢........

function GetContent()
    dim strURL, arURL, strRetval
    select case lcase(request.ServerVariables("URL"))
        case "/content.asp"
            strURL = ""
            arURL = split(request.querystring("url"), "/")
            if request("page") = "" then
                select case lcase(arURL(2))
                    case "searches"
                        select case lcase(arURL(1))
                            case "looking"
                                select case lcase(arURL(3))
                                    case "ohai"
                                        strRetval = "Lorem"
                                    case "blahblah"
                                        strRetval = "Lorem Ipsum"                        
                                    case "edinburgh"
                                        select case lcase(arURL(4))
                                            case "ohai"
                                                strRetval = "Ipsum"
                                            case "ohno"
                                                strRetval = "Lorem"
                                        end select
                                    case "bristol"
                                        select case lcase(arURL(4))
                                            case "some_blahblah"
                                                strRetval = "LOREM"
                                            case "overthere"
                                                strRetval = "LOREM"
                                            case "blahblah"
                                                strRetval = "LOREM"
                                        end select
                                    case "cambridge"
                                        select case lcase(arURL(4))
                                            case "some_rubbish"
                                                strRetval = "Lorem"
                                        end select
                                    case else
                                        strRetval = " "
                                end select
                            case else
                                strRetval = " "
                        end select
                    case else
                        strRetval = " "
                end select 
            end if
    end select 
    strRetval = strRetval & "<style>h2{border: 0px);</style>"
    GetContent = strRetval
end function

2 个答案:

答案 0 :(得分:2)

您正在使用通过查询字符串传递的值并将其拆分为“/”字符 - 当值不包含“足够”斜杠时,您将收到错误并且代码将崩溃。

例如,如果查询字符串参数url仅为“/ something”,那么即使arURL(2)也会失败,因为数组只有两个项目。 (第一个是空字符串,第二个是“东西”)

为了避免所有这些混乱,我可以建议的最好方法是编写自定义函数,将数组和索引作为其参数,并返回给定索引中的项,如果存在则为空字符串:

Function GetItemSafe(myArray, desiredIndex, defValue)
    If (desiredIndex < LBound(myArray)) Or (desiredIndex > UBound(myArray)) Then
        If IsObject(defValue) Then
            Set GetItemSafe = defValue
        Else  
            GetItemSafe = defValue
        End If
    Else  
        If IsObject(myArray(desiredIndex)) Then
            Set GetItemSafe = myArray(desiredIndex)
        Else  
            GetItemSafe = myArray(desiredIndex)
        End If
    End If
End Function

(结束了更多通用版本,让调用代码决定在索引超出数组范围时的默认值)

有了这个,请更改代码以使用该函数,而不是直接访问数组。

这一行例如:

select case lcase(arURL(2))

应改为:

select case lcase(GetItemSafe(arURL, 2, ""))

相应更改其余行,当给定值无效时,您将不会再出错。

答案 1 :(得分:1)

错误在最基本的层面上说的是你试图从一个不存在的数组元素中获取信息,例如,arURL可能已被声明为3个元素,但是访问了第4个元素。生成&#34;下标超出范围&#34;错误。

如果您正在键入数组中的最后一个元素,您可能会查看UBound()函数,该函数返回数组中的高索引元素,例如:

select case lcase(arURL(ubound(arURL))

但是,代码中可能还有其他内容会改变您决定使用哪个元素作为&#34;选择案例的目标的方式,&#34;因此建议发布更多的代码。