Почему 'Ссылка на объект не набор к экземпляру объекта' не является более описательным?

Как разработчик, мы часто встречаемся с тем исключением: NullReferenceException с известным сообщением об ошибке:

Ссылка на объект не набор к экземпляру объекта

Разве для платформы.NET не возможно возвратить что-то значимое?

Что-то, такое как:

Объект типа X по имени Y не набор к экземпляру объекта

5
задан joerage 14 January 2010 в 19:25
поделиться

3 ответа

Потому что это самый общий способ сказать это.

-121--4605403-

Тестовую рамку shoulda имеет превосходный помощник, который позволяет утверждать определенные условия относительно электронного письма, которое было sent. Да, вы могли бы сделать это самостоятельно с ActionMailer.deliveries, но shoulda делает это все один аккуратный маленький блок

-121--1110401-

Объект не имеет имени - так как он может сказать вам имя? Нулевая ссылка может быть загружена из переменной - или она могла быть возвращена методом, свойством и т. д.

JIT может , вероятно, просмотреть информацию стека, чтобы выяснить, каким был объявленный тип ссылки, но я не уверен, как часто это поможет - и, несомненно, это замедлит ситуацию.

Я не могу сказать, что когда-либо находил, что это огромное бремя, когда дело доходит до отладки - если есть много вещей, которые могут быть нулевыми в одной строке, это обычно говорит о том, что стоит разделить их больше.

15
ответ дан 18 December 2019 в 09:07
поделиться

Мне это походит просто на проблему предпочтения. Если это прослушивает вас так очень, вы могли бы всегда разделять на подклассы NullReferenceException и изменять сообщение. :)

, К чему это сводится, хотя объем информации, доступный, когда сообщение создается. Вручную не передавая в некоторой дополнительной информации, просто определяя название поля, которое было пустым в , NullReferenceException потребует отражения (возможно не так мало), который является операцией довольно большой нагрузки. Взять, например, ArgumentNullException для броска того, в котором сообщение указывает на незаконное название параметра, необходимо передать в последовательности при вызове его: бросают новый ArgumentNullException ("param1") .

уровень детализации в сообщении об исключении полностью до программиста, который определяет его, но благоразумно постараться не делать что-либо система, интенсивная при выдаче исключения.

2
ответ дан 18 December 2019 в 09:07
поделиться

Я только что просмотрел эту же проблему с оболочкой .Net для библиотеки FreeImage. Я создал две конфигурации сборки: одну для x86 и одну для x64 для проекта, ссылающегося на управляемую оболочку. Я добавил разделы условной копии msbuild в цель AfterBuild файла проекта так:

  <Target Name="AfterBuild">
    <Copy Condition="'$(Platform)' == 'X86'" SourceFiles="$(MSBuildProjectDirectory)\Resources\x86\FreeImage.dll" DestinationFolder="$(TargetDir)" />
    <Copy Condition="'$(Platform)' == 'X64'" SourceFiles="$(MSBuildProjectDirectory)\Resources\x64\FreeImage.dll" DestinationFolder="$(TargetDir)" />
  </Target>
-121--4349624-

Я нашел действительно очень плохой обходной путь. Для передачи свойства id можно использовать атрибут title.

fixMarkerId = function () {
                $('div[title^="mtg_"]').each(function (index, elem) {
                    el = $(elem);
                    el.attr('id', el.attr('title'));
                    el.removeAttr('title');
                });
            },
            tryAgainFixMarkerId = function () {
                if ($('div[title^="mtg_"]').length) {
                    fixMarkerId();
                } else {
                    setTimeout(function () {
                        tryAgainFixMarkerId();
                    }, 100);
                };
            }

if ($('div[title^="mtg_"]').length) {
                fixMarkerId();
            } else {
                setTimeout(function () {
                    tryAgainFixMarkerId();
                }, 100);
            };

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

-121--2541554-

Потому что это самый общий способ сказать это.

1
ответ дан 18 December 2019 в 09:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: