0

好的,我是 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
4

2 回答 2

2

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

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

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

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, ""))

相应地更改这些行的其余部分,当给定值无效时,您将不再收到错误。

于 2012-10-11T07:49:47.417 回答
1

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

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

select case lcase(arURL(ubound(arURL))

但是,代码中可能会发生其他事情,这会改变您确定应将哪个元素用作“选择案例”的目标的方式,因此建议发布更多代码。

于 2012-10-10T15:37:38.737 回答