Object object что за ошибка
Перейти к содержимому

Object object что за ошибка

  • автор:

Требуется объект (ошибка 424)

Для ссылок на свойства и методы зачастую требуется явный описатель объекта. Эта ошибка имеет следующие причины и способы решения:

  • При ссылке на свойство или метод объекта не указан допустимый описатель объекта. Укажите описатель объекта, если он не задан. Например, можно опустить описатель объекта при ссылке на свойство формы в собственном модуле формы, однако, необходимо явно задать описатель при ссылке на свойство из стандартного модуля.
  • Описатель объекта указан, но не распознается как объект. Проверьте правильность написания описателя объекта и убедитесь в том, что объект видим в той части программы, где на него присутствует ссылка. В случае с объектами коллекции проверьте все вхождения метода Add, чтобы убедиться в том, что для всех элементов используется правильный синтаксис и правописание.
  • Указан допустимый описатель объекта, но другие части вызова содержат ошибку. Неправильный путь в качестве аргумента к команде «Открыть файл»ведущего приложения может вызвать ошибку. Проверьте аргументы.
  • При назначении ссылки на объект не использовался оператор Set. Если при назначении возвращаемого значения вызова CreateObject в переменную Variant пропущен оператор Set, ошибка может не возникать. В следующем примере кода создается неявный экземпляр Microsoft Excel, а его свойство по умолчанию (строка «Microsoft Excel») возвращается и присваивается Variant RetVal . Последующая попытка использовать RetVal в качестве ссылки на объект вызывает следующую ошибку:

 Dim RetVal ' Implicitly a Variant. ' Default property is assigned to Type 8 Variant RetVal. RetVal = CreateObject("Excel.Application") RetVal.Visible = True ' Error occurs here. 

Для получения дополнительной информации выберите необходимый элемент и нажмите клавишу F1 (для Windows) или HELP (для Macintosh).

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

$mol_strict: Как же меня [object Object] этот ваш undefined NaN

Здравствуйте, меня зовут Дмитрий Карловский и я… не прощаю ошибок. Как только вижу оную — тут же бросаю что-нибудь исключительно тяжёлое. И как же тяжела работа программиста на JS.

class Foo extends Object < get name()< return 'Jin' >> const foo = new Foo `Здравствуйте, $< foo >!` // "Здравствуйте [object Object]!" `В этом месяце вы заработали $ < foo / 1000 >тысяч рублей.` // "В этом месяце вы заработали NaN тысяч рублей." `Ваша цель "$< 'foo'[4] >" наконец-то достигнута.` // "Ваша цель "undefined" наконец-то достигнута." `Осталось ещё $ < foo.length - 1 >целей и вы достигнете успеха.` // "Осталось ещё NaN целей и вы достигнете успеха." foo.__proto__= < name: 'придурок' >; `До скорых встреч, $< foo.name >.` // "До скорых встреч, придурок."

Облегчить его страдания можно разными путями..

  1. Прикрыться тайпскриптом. Но в рантайме ноги всё равно остаются босыми, и на них кто-нибудь вечно наступает.
  2. Обложиться проверками. Но чуть замешкаешься и рантайм грабли тут же бьют по голове.
  3. Исправить JS. Даже не надейтесь.
  4. Исправить JS рантайм. Ну, давайте подумаем..

Проблемы с динамической типизацией JS возникают по 3 основным причинам:

  • Автоматическое (и порой неуместное) приведение типов, когда значение одного типа используется в контексте, предназначенном для другого, вместо сообщения об ошибке.
  • Возврат undefined в качестве значения не объявленных полей вместо сообщения об ошибке.
  • Случайное или злонамеренное изменение всего прототипа, при установке значения одного поля, вместо изменения только этого поля.

Сначала разберёмся с первой проблемой. JS устроен так, что приведение примитивных типов мы никак исправить не сможем. А вот за приведением объектов у нас есть полный контроль. Поэтому давайте пропатчим глобальный прототип всех объектов, чтобы никакие объекты по умолчанию не допускали приведения типов:

Object.prototype[ Symbol.toPrimitive ] = function()

Теперь, чтобы разрешить приведение типа, нужно переопределить метод Symbol.toPrimitive у нужного объекта.

Ладно, с первой проблемой разобрались. Но как-то она далась нам подозрительно легко… Что-то тут не так! Не похоже это на Веб… Ну да ладно, пошли к следующей.

Тут нам нужно как-то перехватывать обращения к произвольным полям объекта, даже если они ещё никак не были объявлены. В JS для этого есть только один механизм — прокси. Что ж, напишем такой прокси который при обращении к любому полю громко ругается квазицензурными словами:

export let $mol_strict_object = new Proxy( <>, < get( obj: object, field: PropertyKey, proxy: object ) < const name = JSON.stringify( String( field ) ) throw new TypeError( `Field $< name >is not defined` ) >, >)

К сожалению, поменять prototype у Object , как мы это сделали ранее, браузер нам уже не даст. Как и поменять прототип у Object.prototype — он всегда будет null . Зато мы можем менять прототипы у почти всех остальных стандартных классов унаследованных от Object :

Поэтому пройдёмся по всем глобальным переменным:

for( const name of Reflect.ownKeys( $ ) ) < // . >

Отсеем те из них, кто не является классами:

const func = Reflect.getOwnPropertyDescriptor( globalThis, name )!.value if( typeof func !== 'function' ) continue if(!( 'prototype' in func )) continue

Обратите внимание, что мы не используем globalThis[name] для получения значения, чтобы не триггерить ненужные варнинги.

Теперь оставляем лишь те классы, что непосредственно унаследованы от Object :

const proto = func.prototype if( Reflect.getPrototypeOf( proto ) !== Object.prototype ) continue

И, наконец, подменяем прототип прототипа с Object.prototype на наш строгий вариант:

Reflect.setPrototypeOf( proto, $mol_strict_object )

Теперь почти все стандартные объекты будут смотреть на вас с укоризной, при обращении к свойству, которому не задано значение. Ведь если значение задано, то браузер не пойдёт по цепочке прототипов и не дойдёт до нашего прокси.

К сожалению, есть и исключения, такие как сам Object, все объектные литералы и всё, что унаследовано от EventTarget, который тоже не дают менять.

И тут CSSStyleDeclaration делает нам подножку: если подменить его прототип на прокси (даже прозрачный, не кидающий исключений), то, внезапно, в Хроме 89 он перестаёт синхронизироваться с атрибутом style dom-элемента:

( > /> ).outerHTML // 

Поэтому его пока что приходится вносить в исключения.

Есть и ещё одна беда… Если объявлять прикладные классы так:

class Foo <>

То объекты этих классов не будут строгими. Но если объявить их так:

class Foo extends Object <>

То… ничего особо не изменится. Но вот если подменить глобальный объект Object на свой строгий подкласс:

globalThis.Object = function $mol_strict_object( this: object, arg: any ) < let res = Object_orig.call( this, arg ) return this instanceof $mol_strict_object ? this : res >Reflect.setPrototypeOf( Object, Reflect.getPrototypeOf(<>) ) Reflect.setPrototypeOf( Object.prototype, $mol_strict_object )

То прикладные классы, явно унаследованные от Object , станут строгими.

Что ж, попарились на славу, другое дело. Последняя же проблема решается снова просто — удаляем геттер и сеттер для свойства __proto__ в результате чего, оно перестанет менять прототип объекта, а будет самым обычным полем, как и все остальные:

delete Object.prototype.__proto__

Однако, подчеркну, что если вы используете deep merge или deep compare, то в них необходимо проверять, что поле является собственным и игнорировать все остальные:

function merge_deep( left: object, right: object ) < for( let key of Reflect.ownKeys( right ) ) < if( left[ key ] && typeof left[ key ] === 'object' && right[ key ] && typeof right[ key ] === 'object' && Object.getOwnPropertyDescriptor( left, key ) ) < merge_deep( left[ key ], right[ key ] ) >else < left[ key ] = right[ key ] >> return left >

Иначе через такие стандартные свойства любого объекта, как contructor , toLocaleString и другие, можно будет дойти чуть ли не до любого объекта в приложении, что является лишним при работе с POJO.

Итак, что у нас получилось.

class Foo extends Object < get name()< return 'Jin' >> const foo = new Foo `Здравствуйте, $< foo >!` // TypeError: Field "Symbol(Symbol.toPrimitive)" is not defined `В этом месяце вы заработали $ < foo / 1000 >тысяч рублей.` // TypeError: Field "Symbol(Symbol.toPrimitive)" is not defined `Ваша цель "$< 'foo'[4] >" наконец-то достигнута.` // TypeError: Field "4" is not defined `Осталось ещё $ < foo.length - 1 >целей и вы достигнете успеха.` // TypeError: Field "length" is not defined foo.__proto__= < name: 'придурок' >; `До скорых встреч, $< foo.name >.` // "До скорых встреч, Jin."

На случай, если это будут читать дети, подчеркну:

Не меняйте поведение рантайма в библиотеках, ибо таким образом вы можете сломать кому-нибудь приложение. А вот для запуска тестов лучше использовать как раз максимально строгий рантайм — мало ли использовать вашу библиотеку будут именно в нём.

Если хотите лучше понять как всё это работает, то гляньте эту статью: Насколько JavaScript сильный?.

Полные исходники можно найти тут: $mol_strict.

Для подключения к своему NPM проекту достаточно прописать где-нибудь в начале точки входа:

import "mol_strict"
require("mol_strict")

Другие независимые сборки микробиблиотек из $mol можно найти тут: $mol: Usage from NPM ecosystem.

А если хотите обсудить подноготную JS рантайма, то присоединяйтесь к этим чатам:

  • У браузера под юбкой (Обсуждаем разработку браузерных движков. Парсинг, рендеринг, архитектура, вот это всё.)
  • UfoStation Chat (ФП — Фронтенд и Программирование.)

Наконец, в Твиттере _jinnin можно обнаружить много свежих мыслей на тему фронтенда, JS, UX и прочей дичи.

Error

Экземпляры объекта Error выбрасываются при возникновении ошибок во время выполнения. Объект Error также может использоваться в качестве базового для пользовательских исключений. Смотрите ниже стандартные встроенные типы ошибок.

Описание

Во время выполнения кода ошибки приводят к созданию и выбрасыванию новых объектов Error .

Типы ошибок

Кроме общего конструктора Error , в JavaScript существуют другие встроенные конструкторы ошибок, смотрите раздел Выражения обработки исключений.

Создаёт экземпляр, представляющий ошибку, возникающую в глобальной функции eval() .

Создаёт экземпляр, представляющий ошибку, возникающую при выходе числовой переменной или параметра за пределы допустимого диапазона.

Создаёт экземпляр, представляющий ошибку, возникающую при разыменовывании недопустимой ссылки.

Создаёт экземпляр, представляющий синтаксическую ошибку, возникающую при разборе исходного кода в функции eval() .

Создаёт экземпляр, представляющий ошибку, возникающую при недопустимом типе для переменной или параметра.

Создаёт экземпляр, представляющий ошибку, возникающую при передаче в функции encodeURI() или decodeURI() недопустимых параметров.

Создаёт экземпляр, представляющий несколько ошибок, обёрнутых в одну. Может быть полезно, например, при работе с Promise.any() .

Создаёт экземпляр, представляющий ошибку, возникающую при выбрасывании внутренней ошибки в движке JavaScript. К примеру, ошибки «слишком глубокая рекурсия» («too much recursion»).

Конструктор

Создаёт новый объект Error .

Статические методы

Error.captureStackTrace() Non-standard

Нестандартная функция V8, которая создаёт свойство stack у экземпляра Error .

Нестандартное числовое свойство V8, которое ограничивает количество уровней ошибок, включаемых в трассировку стека.

Нестандартная функция V8, которая (если задана в пользовательском коде) вызывается JavaScript-движком V8 для выбрасывание исключений, позволяя определять нестандартное форматирование трассировки стека.

Свойства экземпляра

Эти свойства определены в Error.prototype и есть у всех экземпляров Error .

Функция-конструктор, создающая экземпляр объекта. Для экземпляров Error начальным значением является конструктор Error (en-US).

Представляет название типа ошибки. Начальным значением Error.prototype.name является «Error» . Подклассы (например, TypeError и SyntaxError ) имеют собственные значения свойства name .

Нестандартное свойство, содержащее трассировку стека.

Эти свойства являются собственными свойствами каждого экземпляра Error .

  • cause (en-US)
    • : Причина возникновения текущей ошибки — обычно это другая обнаруженная ошибка. Для созданных пользователем объектов Error это значение свойства cause второго аргумента конструктора.
    • : Нестандартное свойство Mozilla, определяющее номер символа в строке, в которой возникла ошибка.
    • : Нестандартное свойство Mozilla, определяющее путь к файлу, в котором возникла ошибка.
    • : Нестандартное свойство Mozilla, определяющее номер строки в файле, где возникла ошибка.
    • : Сообщение об ошибке. Для созданных пользователем объектов Error это строка, передаваемая в качестве первого аргумента конструктора.

    Методы экземпляра

    Возвращает строку, представляющую указанный объект. Переопределяет метод Object.prototype.toString() .

    Примеры

    Выбрасывание обычной ошибки

    Обычно, вы создаёте объект Error с намерением возбудить ошибку с помощью ключевого слова throw . Вы можете обработать ошибку с помощью конструкции try. catch :

    try  throw new Error("Ой!"); > catch (e)  console.error(`$e.name>: $e.message>`); > 

    Обработка ошибки конкретного типа

    Для обработки только определённых типов ошибок можно делать проверку типа с помощью ключевого слова instanceof :

    try  foo.bar(); > catch (e)  if (e instanceof EvalError)  console.error(`$e.name>: $e.message>`); > else if (e instanceof RangeError)  console.error(`$e.name>: $e.message>`); > // и так далее else  // Если ни один из типов не совпал, то оставляем ошибку необработанной throw e; > > 

    Пользовательские типы ошибок

    Вы можете захотеть определить свои собственные типы ошибок, унаследованные от Error , чтобы иметь возможность возбуждать их с помощью throw new MyError() и использовать instanceof MyError для проверки вида ошибки в обработчике исключений. Это помогает делать обработку ошибок более понятной.

    Предупреждение: Встроенные подклассы не могут быть надёжно преобразованы в ES6 код, потому что нет возможности создать базовый класс со специфичным new.target без Reflect.construct() . Требуется дополнительная конфигурация или ручной вызов Object.setPrototypeOf(this, CustomError.prototype) в конце конструктора, иначе создаваемый экземпляр не будет экземпляром CustomError . Смотрите TypeScript FAQ для получения дополнительной информации.

    Примечание: Некоторые браузеры включают конструктор CustomError в трассировку стека при использовании классов ES2015.

    class CustomError extends Error  constructor(foo = "bar", . params)  // Передаём все аргументы (включая специфичные для производителя движка) родительскому конструктору super(. params); // Поддерживаем соответствующую трассировку стека с указанием места возникновения ошибки (доступно только в V8) if (Error.captureStackTrace)  Error.captureStackTrace(this, CustomError); > this.name = "CustomError"; // Дополнительная отладочная информация this.foo = foo; this.date = new Date(); > > try  throw new CustomError("baz", "bazMessage"); > catch (e)  console.error(e.name); // CustomError console.error(e.foo); // baz console.error(e.message); // bazMessage console.error(e.stack); // stacktrace > 

    Спецификации

    Specification
    ECMAScript Language Specification
    # sec-error-objects

    Совместимость с браузерами

    BCD tables only load in the browser

    Смотрите также

    • Полифил Error с поддержкой cause в core-js
    • throw
    • try. catch
    • Stack trace API в документации V8

    Found a content problem with this page?

    • Edit the page on GitHub.
    • Report the content issue.
    • View the source on GitHub.

    This page was last modified on 5 янв. 2024 г. by MDN contributors.

    Your blueprint for a better internet.

    Определенная приложением или объектом ошибка

    Это сообщение появляется, когда ошибка, созданная с помощью метода Raise или инструкции Error, не соответствует ошибке, определенной Visual Basic для приложений. Оно вызывается также функцией Error для аргументов, не соответствующих ошибкам, определенным Visual Basic для приложений. Таким образом, это может быть ошибка, определенная вами или объектом, включая ведущие приложения, такие как Microsoft Excel, Visual Basic и т. д. Например, формы Visual Basic создают связанные с формами ошибки, которые нельзя создать из программы, просто указав номер в качестве аргумента метода Raise или функции Error. Это сообщение имеет следующие причины и решения:

    • Приложение выполнило оператор Err.Raisen или Errorn, но номер n не определен программой Visual Basic для приложений. Если это то, что требовалось, используйте Err.Raise и задайте дополнительные аргументы, чтобы конечному пользователю была понятна суть ошибки. Например, можно добавить строку описания, источник и справочную информацию. Чтобы повторно создать ошибку, которую вы перехватили, не следует выполнять перед этим Err.Clear. Если вначале выполнялась Err.Clear, нужно добавить дополнительные аргументы для метода Raise. Убедитесь, что воссоздаете ту же ошибку, просмотрев ее контекст;
    • при доступе к объектам из других приложений на вашу программу могла распространиться ошибка, которую нельзя сопоставить с ошибкой Visual Basic.

    Просмотрите в документации описание объектов, к которым был доступ. У объекта Err свойство Source должно содержать программный идентификатор приложения или объекта, в котором создана ошибка. Чтобы понять контекст ошибки, возвращаемой объектом, вы можете использовать конструкцию On Error Resume Next, а не синтаксис строкиOn Error GoTo в коде для получения доступа к объектам.

    Перечисление перехватываемых ошибок для ведущего приложения

    Ранее программисты, как правило, использовали цикл для вывода всех строк с сообщениями об ошибках, которые можно перехватить. Обычно это описывалось в таком коде:

    For index = 1 to 500 Debug.Print Error$(index) Next index 

    Такой код по-прежнему перечисляет все сообщения об ошибках Visual Basic для приложений, но отображает сообщение «Application-defined or object-defined error» («Ошибка, определенная приложением или объектом») для ошибок, определенных ведущими приложениями (например для тех, которые в Visual Basic относятся к формам и элементам управления). Многие из этих ошибок являются перехватываемыми ошибками выполнения. Используйте диалоговое окно Поиск в разделе справки, чтобы найти список перехватываемых ошибок вашего ведущего приложения. Щелкните Search (Поиск), введите trappable (перехватываемые) в первом поле ввода и нажмите Show Topics (Показать темы). Выберите Trappable Errors (Перехватываемые ошибки) в нижнем окне списка и нажмите Go To (Перейти).

    Для получения дополнительной информации выберите необходимый элемент и нажмите клавишу F1 (для Windows) или HELP (для Macintosh).

    Поддержка и обратная связь

    Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *