Обнаружение того, что является целевым объектом, когда выбрасывается NullReferenceException

Вы должны сказать EHLO, прежде чем просто перейти прямо в STARTTLS:

server = smtplib.SMTP('smtp.gmail.com:587')
server.ehlo()
server.starttls()

Также вы должны действительно создавать заголовки сообщений From:, To: и Subject: , отделенные от тела сообщения пустой строкой и использующие CRLF в качестве маркеров EOL.

Например

msg = "\r\n".join([
  "From: user_me@gmail.com",
  "To: user_you@gmail.com",
  "Subject: Just a message",
  "",
  "Why, oh why"
  ])
30
задан StingyJack 17 June 2010 в 14:45
поделиться

10 ответов

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

А лучшее решение этого вида проблемы Дизайн Контракта , или через встроенные конструкции языка, или через библиотеку. DbC предложил бы предварительно проверить любые входящие аргументы в пользу метода для данных из диапазона (т.е.: Пустой указатель) и выдавание исключения, потому что метод не будет работать с неправильными данными.

[Редактирование для соответствия редактированию вопроса:]

я думаю, что описание NRE вводит в заблуждение Вас. Проблема, которую имеет CLR, состоит в том, что попросили разыменовать ссылку на объект, когда ссылка на объект является Пустой. Возьмите этот пример программы:

public class NullPointerExample {
  public static void Main()
  {
    Object foo;
    System.Console.WriteLine( foo.ToString() );
  }
}

при выполнении этого это собирается бросить NRE на строку 5, когда это пыталось оценить ToString () метод на нечто. Нет никаких объектов отладить, только неинициализированная ссылка на объект (нечто). Существует класс и метод, но никакой объект.

<час>

Ре: Chris Marasti-Georg's ответ :

Вы никогда не должны бросать NRE сами - это - системное исключение с определенным значением: CLR (или JVM) попытался оценить ссылку на объект, которая не была инициализирована. Если Вы предварительно проверите ссылку на объект, то или выдать своего рода исключение недействительного аргумента или специализированное исключение, но не NRE, потому что Вы только смутите следующего программиста, который должен поддержать Ваше приложение.

17
ответ дан Craig Trader 17 June 2010 в 14:45
поделиться
  • 1
    Всегда очищайте дополнительные группы также. initgroups существует на AIX, Солярисе, HP-UX, FreeBSD, Darwin, Linux, и вероятно других. Включайте его так сбои сборки если это can' t быть найденным. Не отбрасывание всех групп может привести к серьезному системному компромиссу и CVEs. Я don' t думают, что chdir имеет какие-либо последствия безопасности вообще, не так ли? – Nicholas Wilson 22 February 2013 в 23:04

Существует действительно не очень, можно сделать помимо взгляда на отслеживание стека; при разыменовании нескольких ссылок на объект в той же строке кода нет никакого способа определить, какой является пустым, не устанавливая точку останова. Вы могли избежать этого, только разыменовав один объект на строку, но это приведет к некоторому довольно ужасно выглядящему коду.

1
ответ дан Oliver Mellet 17 June 2010 в 14:45
поделиться
  • 1
    @BrenBarn - я должен согласиться с Вами - существует партия из потрясающего материала в Джиндже - волшебные pseudo-globals не имеют той категории. – Sean Vieira 19 December 2012 в 03:08

Ну, Вы не можете действительно определить объект, поскольку он не существует и таким образом исключение, которое Вы получаете.

1
ответ дан Pawel Pabich 17 June 2010 в 14:45
поделиться
  • 1
    Я вижу теперь, спасибо. Существует очень для наслаждения в Jinja2. – blueblank 19 December 2012 в 03:31

Строка # и файл обычно является всем, что необходимо найти преступником. Если Вы - тот, выдающий исключение, рассматриваете использование ArgumentNullException, в подходящих случаях, или проверяющий на пустые указатели и бросающий NullReferenceException с, которые имеют больше деталей о пустом поле.

Редактирование Ваше редактирование:)

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

Вт. Craig Trader

Положительная сторона. Для нулевого значения, которое передается в метод, ArgumentNullException, должен быть брошен. Для членской переменной, которая еще не была инициализирована, что-то как InvalidStateException, вероятно, будет хорошо для броска. К сожалению, я не могу найти никакое подобное исключение в MSDN. Самокрутка?

1
ответ дан Chris Marasti-Georg 17 June 2010 в 14:45
поделиться
  • 1
    Подход комментария didn' t работают на меня. Могла бы быть конкретная версия. – Jakob Simon-Gaarde 9 June 2016 в 16:32

Как несколько ответов указали, скажите Visual Studio повреждаться на Броске для NullReferenceException.

, Как сказать VS повреждаться, когда необработанные исключения брошены

  • меню Debug | Исключения (или Ctrl + Высокий звук + E )
  • Развертка в Исключения Общеязыковой среды выполнения
  • , Развертка в Систему
  • Находит Систему. NullRefernceException, и устанавливают флажок для Повреждения каждый раз, когда это исключение выдается, вместо того, чтобы позволить ему продолжаться к любым блокам Выгоды существуют

Поэтому теперь, когда это произойдет, VS сразу повредится, и Текущая строка Оператора будет находиться по выражению, которое оценило к пустому указателю.

Это средство полезно для всех видов исключений, включая пользовательские (может добавить полностью определенное имя типа, и VS будет соответствовать ему во время Отладки)

, один недостаток к этому подходу состоит в том, если существует код, загруженный в отладчике, который следует плохой практике броска и ловли большого количества исключений, которые Вы ищете, в этом случае это возвращается в стог сена / проблема иглы (если Вы не можете зафиксировать тот код, конечно - тогда Вы решили две проблемы:)

<час>

Еще один прием, который может пригодиться (но только на некоторых языках) является использованием Когда (или эквивалентный) ключевое слово... В VB это похоже

Try
  ' // Do some work           '
Catch ex As Exception When CallMethodToInspectException(ex)

End Try

, прием здесь - то, что, Когда выражение оценено , прежде чем стек вызовов раскручен к блоку Выгоды . Таким образом, при использовании отладчика можно установить точку останова, что выражение, и если Вы смотрите на окно стека вызовов (Отладка | Windows | Стек вызовов), Вы видите и перешли для выравнивания, который инициировал исключение.

(Можно принять решение возвратить false от CallMethodToInspectException, таким образом, блок Выгоды будет проигнорирован и время выполнения продолжит поиск через стек для соответствующего блока Выгоды - который может допускать вход, который не влияет на поведение, и с меньше служебным, чем выгода и перебросок)

<час>

, Если Вы просто интересовались неинтерактивным входом, затем предполагая, что у Вас есть Отладочная сборка (или в некоторой степени как Вы имеете, заключают сделку с проблемами оптимизации, Сборку конечных версий с PDBs), Вы могли добраться, большая часть информации должна была разыскать ошибку от Исключения ToString с включенным stack-trace-with-line-number.

, Если однако номер строки не был достаточно, можно получить номер столбца также (так в значительной степени, локальная деталь или выражение, которое является пустым) путем извлечения StackTrace для исключения (использующий или вышеупомянутую технику, или только в самом блоке выгоды):

int colNumber = new System.Diagnostics.StackTrace(ex, true).GetFrame(0).GetFileColumnNumber();
<час>

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

17
ответ дан Valery Viktorovsky 17 June 2010 в 14:45
поделиться
  • 1
    Ничего себе, это - очень неприятное проектное решение. – BrenBarn 19 December 2012 в 03:06

можно проверить сообщение и свойства InnerException

http://msdn.microsoft.com/en-us/library/system.exception.innerexception.aspx

0
ответ дан Kuvo 17 June 2010 в 14:45
поделиться
  • 1
    Сделайте Вы имеете в виду I' m предполагаемый записать {% if False %}{{ kwargs }}{% endif %} или версия Taylor записал? О... – hyperknot 19 November 2016 в 00:22

Если бы Вы ловите свои исключения для дружественных пользовательских сообщений или регистрируетесь, Вы, вероятно, хотели бы, чтобы отладчик остановился при исключении при отладке. Перейдите к Отладке/Исключениям и проверьте типы исключительной ситуации, которые Вы хотите, чтобы отладчик прекратил выполнять в, Система. NullReferenceException в Вашем случае.

0
ответ дан Eduardo Campañó 17 June 2010 в 14:45
поделиться
  • 1
    Просто любопытный, но Вы пробовали это? http://developer.android.com/reference/android/content/Context.html#createPackageContext(java.lang.String, int) это бросило бы SecurityException? – trevor-e 18 August 2014 в 17:07

Установите VS для повреждения на исключениях, тогда когда Вы получаете свою ошибку, обычно довольно очевидно, какая строка это идет. Окно отслеживания стека скажет Вам, как Вы добрались там. Не очень еще можно сделать кроме этого.

0
ответ дан MarcE 17 June 2010 в 14:45
поделиться
  • 1
    Нет, я не попробовал @trevor-e, и я не понял, как это вписывается в проблему. – ozbek 18 August 2014 в 23:04

Для ссылки, подобного потока: я должен поймать исключения только для входа их?

Угловые точки - то, что Вы хотите эффективно получить исключение. По моему опыту, цель состоит в том, чтобы удостовериться, что программист проверяет на нулевые ссылки в коде - однако мы знаем, что в действительности, скучаем по некоторым. Код UI должен иметь некоторый уровень обработки исключений. Мне понравился мой ответ на тот вопрос: Мой Ответ . Что еще более важно, комментарий информация 1800 года , кто указал, что Вы просто бросаете, и не бросок исключая тем, для получения всего отслеживания стека, которое является, как Вы в конечном счете отлаживаете эти проблемы.

0
ответ дан Community 17 June 2010 в 14:45
поделиться
  • 1
    However, calling LightPurchaseFlowActivity from non-Google signed app is failing, because they are, again apparently (according to the logs), checking the calling package's signature: Ссылка, которую я отправил Вам, позволяет Вам получать объект контекста другого приложения и могла потенциально выполнить то Намерение для Вас. – trevor-e 19 August 2014 в 14:08

Относительно установки Visual Studio для ловли исключения (как предложено здесь ) не ЗАБЫВАЙТЕ удалять эту опцию, как только Вы решили проблему. Я только что потратил впустую полчаса, пытаясь разработать, почему мое приложение зависало глубоко в некоторой части Системы. Windows. Формы....

0
ответ дан Community 17 June 2010 в 14:45
поделиться
Другие вопросы по тегам:

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