Здравствуйте, Nuald, Вы писали:
N>Пример. Переименовываешь файл, нажимаешь Del, стирается полное имя файла, вылетает необработанное исключение, студия закрывается с ошибкой. Какое здесь должно быть поведение?
Только что повторил описанные тобой действия. При этом у меня уже измененный файл:
http://nemerle.org/svn/vs-plugin/trunk/Nemerle.VsIntegration/Project/ProjectInfo.cs
При попытке нажать Enter, если имя пустое появляется сообщение:
You must enter a name.
Так что все ОК. Возможно помогли правки по существу.
N> Если придерживаться стратегии, которую ты описал, так и должно быть. Меня, как конечного пользователя, это сильно напрягает.
Продукт не находится в стадии когда нужно говорить о конечных пользователях. Это раз.
Переименование должно просто корректно работать. И из-за того, что оно не работает корректно нельзя писать код который может скрыть ошибки в других местах. Надо просто отработать логику этого участка.
У нас, например, удаление файлов вообще не работает. Ну, так надо содиться и разбираться.
N> Как разработчик, причину я устранить не могу, но замазыванием я спасаю студию, пусть и с вылетом где-то First-chance exception.
А в чем проблема?
N> И где компромисс?
Ситуация чисто теоретическая, я просто хочу знать, как в ней быть, чтобы впредь ничего не сломать.
Компромисы не нужны. Вот когда мы будем подготавливать релиз, то постораемся обеспечить минимум вылетов с перенаправлением ошибок в логи. А пока это тлько вредит.
Потом подобные проблемы решаются по другому. В функции переименования файла обязательно есть место где можно отловить все исключения и выдать о них сообщение об ошибке (в виде высплывающего окна). Так, например, сделано в функциях добавления ссылок на сборки.
N>Опять привожу для примера ситуацию выше. Замазыванием ошибки я сделал работу конечного пользователя более комфортной.
Это глубочайшее заблуждение. В конечном итоге такая "помощь" пользователю приведет к тому, что многие ошибки не будут устранены и программа будет то и дело поподать в неопределенное положение. Вроде как краха нет, но ничего (или многое) не работает.
Ты пользовался Дельфи? Вот во многих версиях ее IDE тоже было много заплаток. И переодически ее приходилось перезагружать, так как работать с ней было совершенно невозможно.
В общем, на начальных стадиях разрабокти, когда функциональность еще не доделана такие замазки очень опасны.
И уж если делаются замазки, то их долно быть минимум. Например, перехватить все исключения в какой-то отчке. А везеде всавлять проверки на пустые строки — это плохо.
N> В чем я неправ? Да, я не устранил причину, но до некоторых причин докопаться очень тяжело или вообще нереально, т.к. они вызываются где-то из недр студии.
Если причина не ясна, то надо описать ее здесь или запостить в баг-трекер. Глядишь кто-то знает то что поможет решить эту проблему. Ну, или просто разберется более детально.
VD>>Вот здесь уже большой вопрос. Я не представляю себе шататной ситуации когда путь к файлу будет пустым. Хотя бы имя то у него должно быть? А раз так тут надо вставлять проверки с возбуждением исключеий. Или хотя бы ничего не делать.
N>Ситуацию я описал выше.
Вотя я заменил эту проверку на исключени и ровным счетом твоя ситуация не изменилась. Все работает. Значит проблема была в другом. А в следствии, например, глюков отладчика ты не смог ее обнаружить.
VD>>Заметь, даже если не ставить проверки, то функция ContainsKey() класса Dictionary проверит аргументи и выдаст исключение ArgumentNullException. Твой же код скроет ошибку.
N>ArgumentNullException вывалит студию.
А где он появляется?
Я пока не удалял твои обработчики, но поставил там точки прирывания и пока ни разу туда не попал.
Как воспроизвести эти исключения?
N>Нет, не замазка. Смысл есть. Единственное, не уверен насчет new NemerleFileNodeProperties(null). Здесь надо кидать исключение, но не знаю какое.
Да хоть какой-нибудь. Я честно говоря не понял чем не понравилось банальное приведение тиопв. Если что-то было бы не так, то вылетело бы исключение об неправильном приведении типов.
В общем, я это дело заменил на следующее:
private static NemerleFileNodeProperties GetNodeProperties(IVsHierarchy hierarchy, uint itemID)
{
ErrorHelper.ThrowIsNull(hierarchy, "hierarchy");
object propertyValue;
int hr = hierarchy.GetProperty(itemID, (int)__VSHPROPID.VSHPROPID_BrowseObject, out propertyValue);
if (hr != VSConstants.S_OK)
throw new ArgumentException("Can't obtain VSHPROPID_BrowseObject for item with ID "
+ itemID, "itemID", new System.ComponentModel.Win32Exception(hr));
NemerleFileNodeProperties properties = propertyValue as NemerleFileNodeProperties;
if (properties == null)
return new NemerleFileNodeProperties(((FileNodeProperties)propertyValue).Node);
else
return properties;
}
в рассчете на то, что свойства могут оказаться типа FileNodeProperties. Хотя это тоже шаманство, но хотя бы понятно что происходит.
VD>>Ставить проверки чтобы что-то не вываливалось категорически не надо! Если ты не в силах понять причину проблемы, то просто опиши ее в этом форуме или добавь описание в баг-трекер. При этом обясни как воспроизвести эту ошибку. И тогда мы уже вместе решим что с ней делать.
N>Ладно.
Ну, и славно.
... << RSDN@Home 1.2.0 alpha rev. 637>>