Проверьте, существует ли объект в VBScript - PullRequest
18 голосов
/ 04 ноября 2010

Я давно поддерживаю приложение Classic 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"

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

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?

Ответы [ 6 ]

34 голосов
/ 05 ноября 2010

@ Atømix: замените

If Not banners Is Nothing then 

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

If IsObject(banners) Then 

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

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

26 голосов
/ 14 июля 2011

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

Подведем итог:

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

Если переменная объявлена, но не инициализирована, ее значение будет 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: Я только что видел связанный вопрос и ответ , который тоже может помочь.

0 голосов
/ 10 марта 2017

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

Sub FooBar(Optional oDoc As Object)

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

...
0 голосов
/ 24 февраля 2015

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

0 голосов
/ 05 ноября 2010

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

Разве у вас нет head.asp или чего-то включенного на каждой странице?

...