Вы должны сказать 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"
])
В точке, где 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, потому что Вы только смутите следующего программиста, который должен поддержать Ваше приложение.
Существует действительно не очень, можно сделать помимо взгляда на отслеживание стека; при разыменовании нескольких ссылок на объект в той же строке кода нет никакого способа определить, какой является пустым, не устанавливая точку останова. Вы могли избежать этого, только разыменовав один объект на строку, но это приведет к некоторому довольно ужасно выглядящему коду.
Ну, Вы не можете действительно определить объект, поскольку он не существует и таким образом исключение, которое Вы получаете.
Строка # и файл обычно является всем, что необходимо найти преступником. Если Вы - тот, выдающий исключение, рассматриваете использование ArgumentNullException
, в подходящих случаях, или проверяющий на пустые указатели и бросающий NullReferenceException
с, которые имеют больше деталей о пустом поле.
Редактирование Ваше редактирование:)
AFAIK, необходимо было бы исследовать строку отслеживания стека для получения той строки # и файл. Ваш лучший выбор состоял бы в том, чтобы получить самое внутреннее исключение, и затем посмотреть на первую строку его отслеживания стека. Если Вы хотите быть в состоянии программно проанализировать ту информацию для обнаружения, какое поле вызвало пустой указатель, и сделайте что-то с названием того поля, я боюсь, что Вы будете неудачливыми.
Вт. Craig Trader
Положительная сторона. Для нулевого значения, которое передается в метод, ArgumentNullException
, должен быть брошен. Для членской переменной, которая еще не была инициализирована, что-то как InvalidStateException
, вероятно, будет хорошо для броска. К сожалению, я не могу найти никакое подобное исключение в MSDN. Самокрутка?
Как несколько ответов указали, скажите Visual Studio повреждаться на Броске для NullReferenceException.
, Как сказать VS повреждаться, когда необработанные исключения брошены
Поэтому теперь, когда это произойдет, 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 или других исключительных ситуаций во время выполнения, может также интересоваться рассмотрением Охотник за Исключением как инструмент статического анализа.
можно проверить сообщение и свойства InnerException
http://msdn.microsoft.com/en-us/library/system.exception.innerexception.aspx
{% if False %}{{ kwargs }}{% endif %}
или версия Taylor записал? О...
– hyperknot
19 November 2016 в 00:22
Если бы Вы ловите свои исключения для дружественных пользовательских сообщений или регистрируетесь, Вы, вероятно, хотели бы, чтобы отладчик остановился при исключении при отладке. Перейдите к Отладке/Исключениям и проверьте типы исключительной ситуации, которые Вы хотите, чтобы отладчик прекратил выполнять в, Система. NullReferenceException в Вашем случае.
http://developer.android.com/reference/android/content/Context.html#createPackageContext(java.lang.String, int)
это бросило бы SecurityException?
– trevor-e
18 August 2014 в 17:07
Установите VS для повреждения на исключениях, тогда когда Вы получаете свою ошибку, обычно довольно очевидно, какая строка это идет. Окно отслеживания стека скажет Вам, как Вы добрались там. Не очень еще можно сделать кроме этого.
Для ссылки, подобного потока: я должен поймать исключения только для входа их?
Угловые точки - то, что Вы хотите эффективно получить исключение. По моему опыту, цель состоит в том, чтобы удостовериться, что программист проверяет на нулевые ссылки в коде - однако мы знаем, что в действительности, скучаем по некоторым. Код UI должен иметь некоторый уровень обработки исключений. Мне понравился мой ответ на тот вопрос: Мой Ответ . Что еще более важно, комментарий информация 1800 года , кто указал, что Вы просто бросаете, и не бросок исключая тем, для получения всего отслеживания стека, которое является, как Вы в конечном счете отлаживаете эти проблемы.
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. Формы....