OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Суббота, 27 Апрель, 2024 06:15

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 64 ]  На страницу Пред.  1, 2, 3, 4
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 10 Октябрь, 2006 22:17 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Споры споры споры... но в них рождается истина :)
Vlad писал(а):
Но даже если ты просто хочешь аварийно завершить приложение в случае такой ошибки (хотя конкретно в случае DLL смысла в этом очень мало) - это не ASSERT, а аварийное завершение приложения из-за ошибки во внешнем мире. Можешь завести какой-нибудь OUTER_ARGUMENT_ASSERT, чтобы отличать одну ситуацию от другой, потому что в общем случае реакция твоего приложения на такие ситуации может отличаться....
Explorer будет ловить бессмысленный Access Violation, вызванный твоим ASSERT'ом.
Мне кажется, Вы, Vlad, путаете ASSERT в BB с искл. ситуацией (представляемой значением какого-то типа) и/или с макросом assert в C++.

ASSERT - это не тип, который можно определить. Это встроенная в язык процедура, которая прерывает выполнение программы при не выполнении заданного условия. Эти условия не должны возникать если программа написана корректно. В этом смысле он похож на макрос assert из "assert.h". Различают ситуации численными кодами - которые выбираются по определенному соглашению и которые указываются в документации к функциям. Это во-первых.

Во-вторых, ASSERT не завершает программу полностью. Он завершает только вызванную средой процедуру, в которой не выполнилось условие ASSERT с выводом отладочного дампа со значением переменных. Далее среда (программа) функционирует как ни в чем не бывало.

И именно поэтому, все что дает ASSERT в Invoke интерфейса-обработчика - аварийно завершает выполнение процедуры-обработчика. BB как работал так и работает, Explorer - тоже. Единственное - плодятся окна "трэпа" с дампами.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 11 Октябрь, 2006 13:09 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Евгений Темиргалеев писал(а):
Мне кажется, Вы, Vlad, путаете ASSERT в BB с искл. ситуацией (представляемой значением какого-то типа) и/или с макросом assert в C++.


Нет, не путаю.

Евгений Темиргалеев писал(а):
ASSERT - это не тип, который можно определить. Это встроенная в язык процедура,


Я в курсе.

Евгений Темиргалеев писал(а):
Эти условия не должны возникать если программа написана корректно.


Верно. Именно поэтому и не ставят в ASSERT "внешние" переменные, потому что к корректности программы они не имеют никакого отношения. Если провести грубую аналогию, то в срабатывании ASSERT'а виноват только ты. Ты можешь поставить ASSERT на аргументы своей процедуры, чтобы дать понять другому модулю (и другому разработчику), что он не прав - но это осмысленно только в рамках среды BB. За ее рамками - смысла никакого.

Евгений Темиргалеев писал(а):
Различают ситуации численными кодами - которые выбираются по определенному соглашению и которые указываются в документации к функциям.


А вот с численными кодами, кстати, я не очень понял - зачем это нужно? И если нужно, то почему не строка?

Евгений Темиргалеев писал(а):
Во-вторых, ASSERT не завершает программу полностью. Он завершает только вызванную средой процедуру,


В данном случае процедуру вызывает не среда, а Explorer. Или подсистема COM в BB создает какой-то прокси на каждый вызов метода интерфейса? Накладно это было бы, так что я сомневаюсь.

Евгений Темиргалеев писал(а):
BB как работал так и работает, Explorer - тоже.


Естетственно. Если бы Explorer падал при вызове каждой глючной DLL, пользоваться им было бы невозможно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 11 Октябрь, 2006 14:53 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Если Вы считаете нужным продолжить дискуссию, запустите BB, сделайте интерфейсный модуль для MS Internet Contorls при помощи DevComInterfaceGen. Просмотрите Dev-Man в подсистеме Ctl. Попробуйте сделать то, что делал я. Тогда в этой дискуссии будет какой-то смысл...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 11 Октябрь, 2006 16:32 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Евгений Темиргалеев писал(а):
Попробуйте сделать то, что делал я. Тогда в этой дискуссии будет какой-то смысл...


Посмотрел. У тебя не DLL (как я думал), а сам BB. Но это ничего не меняет. CtlT.OutDispatch.Invoke по прежнему зовет система (точнее COM-подсистема Windows). Трап обрабатывается BB. Ладно. Давай попробуем с другой стороны. Как ты думаешь, что получает Explorer при сработавшем ASSERT'е в твоем коде?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 64 ]  На страницу Пред.  1, 2, 3, 4

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB