Odyssey писал(а):Продолжим развитие мысли, вот мы проверили результат на NULL, что делать дальше? Показать сообщение об ошибке и закрыть программу? Если да, то исключение и само это сделает, и незачем его перехватывать и оборачивать чтобы потом сделать то же самим. А вот если из сложившейся ситуации есть разумный выход (например наш второй поток сожрал все ресурсы, мы можем тормознуть его и освободить ресурсы), то да, Exception нужно ловить и делать обработку.
А где его нужно ловить?
В вызываемом методе? Но тогда получается, что за обработку проблем выделения памяти будет отвечать никак не относящийся к этому класс, который ничего не знает о потоках, к примеру.
Тут получается ещё хуже. Более сильное "смешение бизнесс-логики и собственно ...", на что MageSlayer, постом ниже, ругается.
В вызывающем? Так, снова, загромождение кода несвойственной ему функциональностью.
Хотя, это лучше, поскольку обработка ошибок выносится в одно место. Но, опять же, есть у меня, например, добавление элемента в дерево в модуле формы. Откуда он знает про второй поток? И чтобы сделать такую обработку, вероятно придётся совсем нетривиальное что-то придумывать.
В общем обработчике, на всю программу? Ну да. Получается - наиболее приемлемый вариант. Хм... Вот, только вы вспомнили про многопоточность... :- Да и как будет выглядеть этот обработчик? Не слишком сложно? Плюс к тому, надо вернуться из обработки исключения, если она прошла, в точку вызова. Т.е., это не Apllication.OnException, а какая-то функция, которой должен передаваться параметр типа Exception. Множества классов или с множеством параметров, хотя бы для того, чтобы понять в каком месте произошло исключение. Как пример, для недостатка ресурсов: исключение может произойти либо в первом потоке, тогда возможно что-то сделать, либо во втором потоке, тогда нужно выдать сообщение и умереть. Т.е., обработчик должен знать много о структуре программы?
Но опять же, нельзя ловить произвольный Exception (т.е. try .. except без on ..do), потому что его по определению нельзя обработать правильно, ведь неизвестно из-за чего он возник. Т.е. если ловим исключение о нехватке русурсов, в обработке освобждаем ресурсы
Каким образом? См. выше.
Odyssey писал(а):если исключение другое -- нужно его снова перегенерировать, чтобы не прошло незамеченным.
MageSlayer писал(а):Все должно работать без оборачивания пустыми try-except.
И что в итоге? Есть цикл. В результате какой-то ошибки, один из элементов цикла не может быть корректно обработан.
Есть два варианта:
1. Это проблема элемента.
2. Это другая проблема. Какое-то внешнее исключение.
В первом случае, надо продолжить цикл, пропустив элемент. Во-втором - завершить программу или что-то сделать. Нужно определять к какому классу исключений оно относится?
MageSlayer писал(а):Во-первых, с формами, создающимися динамически, вообще работать не будет. Вы будете хранить указатели/объекты, которых уже может не быть "в живых".
Будет.
Во-первых, если форма создаётся через Application.CreateForm.
В принципе, по-другому делать не особо правильно.
Во-вторых, так-то, конечно, да...
Но в каком случае может произойти разрушение формы в свёрнутой программе?
Во-вторых, как вам уже советовали, здесь нужно плясать от функциональности самих форм, а не пытаться запихнуть их в несвойственное им окружение. То есть, или наследовать их все от общего предка с функциональностью сокрытия, или цепляться к ним через события, или "подмешивать" функциональность через интерфейсы.
Так получается, что для того, чтобы корректно свернуть формы и, затем восстановить, требуется создать промежуточный базовый класс? Ва-ха-ха. Удобства, как в деревне.
Каждую форму унаследовать от нового базового класса? А это, вообще, оправданно? Может, тогда лучше в Tag адрес структуры запихнуть? :-
Через события, конечно хуже, т.е. они уже могут использоваться другой функциональностью.
Переопределять обработчики событий? Мда... События и так-то "приятная" вещь. А тут ещё использовать их таким образом? И всё только ради того, чтобы свернуть форму?
(жлобское выражение, сорри)
Ну, лучше, вроде, пока что, ничего не придумали...
Тут из небыстрых решений - перейти на VirtualTreeView + интерфейсы.
Прочитал основное про VirtualTreeView здесь:
http://forum.vingrad.ru/forum/topic-97620.htmlДумаю, что для lazarus принципиально не отличается.
Да, возможно, проще будет отображать изменения. Удобнее. Но ведь принципиально-то ничего не поменяется. Дерево отображает элементы коллекции. Её тоже надо обновлять.
А причём здесь интерфейсы?
Кстати, чего-то я не понял там:
NewPhone := VT.GetNodeData(NewNode);
...
PhoneNode := VT.GetNodeData(Node);
Если PhoneNode - указатель на запись, а GetNodeData возвращает обычный указатель, ведь всё-равно должно быть приведение типов?
Обычно это проблема смешения бизнес-логики (жлобское выражение, сорри) и собственно отрисовки/визуализации/...
Опять же, если визуализация тесно переплетена с "бизнес-логикой", то это тупик. Раньше или позже.
Но ведь нельзя же сделать этакий "сферический MVC в вакууме", где всё отделено?
Особенно в RAD среде, типа lazarus. Больше мучений. Как их не смешивать?
Или я здесь ошибаюсь?
И исключения или их иерархия, имхо, никак не помогут. Не для того, они созданы.
Исключения уберут загромождающую проверку ошибок. И станет легче читать. Т.е., я могу не проверять на nil, а сразу вызвать метод. Если объектная переменная не была инициализирована, выбросится исключение, которое будет обработано "ниже" (в смысле по тексту метода, в блоке except). Это удобнее. Теоретически.
Если нет ресурсов, то программа должна поймать исключение на самом верхнем уровне. И по дороге корректно разрушить все временных объекты.
Т.е., возможность продолжения работы отметается сразу? Или очень усложняется обработка?
krab писал(а):О исключениях. Даже о использовании в цикле обработки упоминается:
Вот это точно: "Abstract: Exceptions are both powerful and very misunderstood."
Читаю. Там, по ходу, много по тому, что нужно написано. Штука годная.
Добавлено спустя 8 минут 51 секунду:Хм... Да там все мои ошибки рассмотрены:
- Код: Выделить всё
Result := True;
try
Temp := StrToInt(aStr);
except
Result := False;
end;
Добавлено спустя 8 минут 29 секунд:2krab:
А есть ли что ещё хорошее по теме? Желательно на старосоветском, поскольку проще читать?