0

OK私はASPの完全な初心者です。

配列で渡される内容に応じて、コンテンツの読み込みが異なるクライアントがあります。

select case lcase(arURL(4))

ただし、空の場合もありますがarURL(4)、その場合は次のエラーが発生します。

関数functionName()の実行中にエラーが発生しました。エラーは次のとおりです。

添え字が範囲外

誰かがこれを修正する方法を知っていますか?

ありがとう

要求に応じてさらにコードをOKします。それはひどいコードであり、私は誰にも頭痛を引き起こすつもりはないので、それを許してください。再度、感謝します ........

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)の場合、配列には2つの項目しかないため、失敗します。(最初の文字列は空の文字列、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, ""))

それに応じて残りの行を変更すると、指定された値が無効になったときにエラーが発生しなくなります。

于 2012-10-11T07:49:47.417 に答える
1

そのエラーが最も基本的なレベルで言っているのは、存在しない配列要素から情報を取得しようとしているということです。たとえば、arURLは3つの要素に対して宣言されている可能性がありますが、4番目にアクセスすると「範囲外の添え字」が生成されます。 " エラー。

配列の最後の要素をキー入力している場合は、配列の高インデックス要素を返すUBound()関数を確認できます。例:

select case lcase(arURL(ubound(arURL))

ただし、「select case」のターゲットとして使用する要素を決定する方法を変更するコードで何か他のことが起こっている可能性があるため、コードをさらに投稿することをお勧めします。

于 2012-10-10T15:37:38.737 に答える