Re[4]: 2 Nuald: Один вопрос
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.09.06 15:25
Оценка:
Здравствуйте, 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>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.