Проверьте, существует ли объект в VBScript

Я поддерживаю приложение классического ASP, написанное в VB Script внешней компанией давно, давно.

У меня есть массив путей образа, например:

dim banners, arrKeys, i
set banners=CreateObject("Scripting.Dictionary")
banners.Add "banner1.jpg", "http://www.somelink.com"
banners.Add "banner2.jpg", "http://www.somelink.com"
banners.Add "banner3.jpg", "http://www.somelink.com"

Это будет ТОЛЬКО на страницах с баннерными объявлениями. Существует некоторый стандартный код, который выполняет итерацию через этот список в файле include (общий для всех страниц).

If Not banners Is Nothing then 
  ' then loop through the Dictionary and make a list of image links
End if

Проблема заключается в том, что если banners не создается на странице (это не на всех страницах), я получаю ошибку Can't find object

Каков правильный способ проверить, существует ли объект в VB Script?

Ответы

Ответ 1

@Atømix: Заменить

If Not banners Is Nothing then 

и используйте

If IsObject(banners) Then 

Другой код, который вы затем можете поместить в файл include и использовать его в верхней части своих страниц, чтобы избежать ненужного дублирования.

@Cheran S: Я тестировал свои фрагменты выше с помощью Option Explicit вкл./выкл. и не встречал ошибок для любой версии, независимо от того, был ли там Dim banners или нет.: -)

Ответ 2

IsObject может работать, но IsEmpty может быть лучшим вариантом - он специально предназначен для проверки наличия или инициализации переменной.

Подводя итог:

  • IsEmpty(var) будет проверять, существует ли переменная (без Object Explicit) или инициализирована
  • IsNull(var) будет проверять, была ли назначена переменная Null
  • var Is Nothing будет проверять, была ли переменная Set до Nothing, но будет выдавать ошибку, если вы попробуете ее на том, что не является объектом
  • IsObject(var) будет проверять, является ли переменная объектом (и, по-видимому, будет возвращаться False, если var Empty).

Ответ 3

Если переменная объявлена, но не инициализирована, ее значение будет Empty, которое вы можете проверить с помощью функции IsEmpty():

Dim banners
If IsEmpty(banners) Then
    Response.Write "Yes"
Else
    Response.Write "No"
End If
' Should result in "Yes" being written

banners будет только Nothing, если вы явно присвоите это значение с помощью Set banners = Nothing.

У вас будут проблемы с этой техникой, если вы включили Option Explicit (что является рекомендацией, но это не всегда так). В этом случае, если banners не был Dim ed, и вы пытаетесь протестировать IsEmpty(banners), вы получите ошибку времени выполнения. Если у вас нет Option Explicit, вам не должно быть никаких проблем.

edit: Я только что видел этот вопрос и ответ, который тоже может помочь.

Ответ 4

На каждой странице должно быть не менее dim banners.

У вас нет head.asp или что-то, что включено в каждую страницу?

Ответ 5

Ни один из элементов IsEmpty, Is Object, IsNull не работает с параметром "Option Explicit", поскольку stealthyninja выше неверно ответил. Единственным способом, который я знаю, является "взломать" "Option Explicit" с настройкой "On Error Resume Next", как это делает Tristan Havelick: Есть ли способ проверить, определена ли функция VBScript?

Ответ 6

Отмечено, что IsMissing() проверяет, был ли передан необязательный параметр, в этом случае объект, например:

Sub FooBar(Optional oDoc As Object)

    'if parameter is missing then simulate it
    If IsMissing(oDoc) Then Dim oDoc as Object: oDoc = something

...