OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Понедельник, 11 Август, 2025 19:24

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




Начать новую тему Ответить на тему  [ Сообщений: 178 ]  На страницу Пред.  1, 2, 3, 4, 5, 6, 7 ... 9  След.
Автор Сообщение
СообщениеДобавлено: Среда, 22 Октябрь, 2008 08:47 

Зарегистрирован: Вторник, 18 Сентябрь, 2007 08:48
Сообщения: 108
Иногда подавление ошибок - это благо.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 08:49 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Ну почему же сразу - не может быть? Отработка подавления аварийной ситуации тоже может содержать ошибку, которая как раз вылезет в самый интересный момент :)
Вы говорите - "иногда подавление ошибок - благо". Я бы добавил - всегда в особых случаях.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 09:11 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Edward Ivanov писал(а):
У оберонщиков: проскочим опасный участок - хорошо, не проскочим - ну и ладно, имеем посмертный дамп.


Ассерты у оберонщиков -- это комментарии.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 09:49 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Илья Ермаков писал(а):
(Кстати, в Эрланге в связи с тем, что несущей единицей является лёгкий процесс, проблема обработки ошибок решена жёстко и просто: помер один "бобик" - и шут с ним, плодим другого).
Так ведь и второй помрет таким же макаром?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 10:07 

Зарегистрирован: Понедельник, 05 Июнь, 2006 09:49
Сообщения: 327
Откуда: Ленинград, Емельянов Алексей Николаевич
Edward Ivanov писал(а):
Assert'ы в основном для проверки входных значений. Что будет в рантайме - не дело ББ.
У оберонщиков: проскочим опасный участок - хорошо, не проскочим - ну и ладно, имеем посмертный дамп. Пользователю от этого польза - как дырка от бублика.

Ну вообще-то все с точностью до наоборот. Это в Delphi написал прямую ветку, вставил ее в try .. except, если все хорошо - проскочили, если не получилось, а нам пофиг.
А в ББ "ловишь" опасную ситуацию в Assert, а затем обрабатываешь и обрабатываешь до тех пор, пока она не перестанет быть опасной.
А вообще интересный вопрос: какая стратегия более выигрышна?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 10:10 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
AVC писал(а):
Илья Ермаков писал(а):
(Кстати, в Эрланге в связи с тем, что несущей единицей является лёгкий процесс, проблема обработки ошибок решена жёстко и просто: помер один "бобик" - и шут с ним, плодим другого).
Так ведь и второй помрет таким же макаром?

Когда я писал про то, что при отказе от процедур exception становятся бессмысленными (откатывать управление некуда), то держал в уме переход на идеологию асинхронных сообщений. Получив дурное асинхронное сообщение не в кого пулять exception, можно лишь перепослать это дурное сообщение куда подальше (в журнал) и забыть про него.

процедуры --> необходимо вернуть управление --> exception для отката управления (goto - для передачи управления)
ассинхронка --> управление никуда не передаётся --> переадресация сообщения ("goto" - для передачи сообщения)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 10:26 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Александр Ильин писал(а):
Что касается примера с парсером, то я и сам немного парсерами занимался, поэтому спрошу вот что. Любой парсер должен уметь обработать неожиданный конец данных (в некотором смысле это - исключительная ситуация, не так ли?). Все циклы парсера обычно пишутся с оглядкой на признак eof. Неужели нельзя было при необходимости прерывания разбора сымитировать eof? Выставили бы внутри модуля соответствующий флаг, что eof не настоящий, а на самом деле ошибка в другом. Стек бы раскрутился сам собой до начальной точки, а там бы уже и проанализировали...?
Я рассматривал подобный вариант в качестве альтернативы.
IMHO, в моем случае это не лучший выход.
Действительно, многие парсеры (компиляторов) не прекращают разбор при нахождении первой ошибки, а стараются собрать и выдать побольше информации. Если вся ошибка в том, что, скажем, пропущена точка с запятой, то компилятор даже может сгенерировать правильный код (с выдачей предупреждения, конечно).
В принципе, классические компиляторы Оберона придерживаются похожей стратегии. Для работы с ошибками в модуле сканера (OSS у Вирта, DevCPM в ББ) есть процедура Mark. HALT в DevCPM вызывается только при условии trap IN options.
Но у меня разбираются простые выражения (т.е. это язык запросов), такая подробность излишня. И причин отвергнуть запрос на самом деле больше (т.к. там еще может быть уже бессмысленное обращение к таблицам). Вот я и решил "огород не городить".
Наверное, подробнее эту тему имеет смысл разбирать уже в ветке, посвященной парсерам или компиляторам.
К нашей же теме имеет отношение тот факт, что в DLL, написанной на КП, я не знаю способа прервать выполнение, аналогичного исключению или HALT. Может, и есть какой-то выход.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 10:32 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Axcel писал(а):
А в ББ "ловишь" опасную ситуацию в Assert, а затем обрабатываешь и обрабатываешь до тех пор, пока она не перестанет быть опасной.
А вообще интересный вопрос: какая стратегия более выигрышна?

Выигрышна в каком смысле?

Оберон-культура ("стратегия ассертов") требует подготовки (-),
но окупается производительностью при равной надежности (+).

Еще можно пообсуждать time-to-market против client satisfaction,
но производительность (time-to-market) у подкованного программостроителя всё равно заметно выше.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 10:38 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Axcel писал(а):
... Это в Delphi написал прямую ветку, вставил ее в try .. except, если все хорошо - проскочили, если не получилось, а нам пофиг.
А в ББ "ловишь" опасную ситуацию в Assert, а затем обрабатываешь и обрабатываешь до тех пор, пока она не перестанет быть опасной.
А вообще интересный вопрос: какая стратегия более выигрышна?

Да, интересно. Думаю, стратегия обработки исключений выходит дешевле, по временным затратам на создание продукта, чем оборонительный стиль ББ. На качестве экономить допустимо, к этому уже все привыкли.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 10:46 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Сергей Губанов писал(а):
Когда я писал про то, что при отказе от процедур exception становятся бессмысленными (откатывать управление некуда), то держал в уме переход на идеологию асинхронных сообщений. Получив дурное асинхронное сообщение не в кого пулять exception, можно лишь перепослать это дурное сообщение куда подальше (в журнал) и забыть про него.
Теперь до меня дошло. :)
Одно пока непонятно: как это - "и забыть про него"? :shock:
Когда мы писали ПО для системы безопасности, то, конечно, предусматривался вариант недоставки (асинхронного) сообщения по каналу связи. Но вариант "плюнуть и забыть" не рассматривался. :) У меня одна из программ исполняла функцию системного ретранслятора (т.е. как раз передавала сообщения от центра к абоненту и наоборот). Послав сообщение, я заводил таймер. Если таймер сработал, а я не получил подтверждения, то, в зависимости от текущего состояния, либо посылал повторное сообщение, либо отправлял центру сообщение о недоставке (такой вот аналог исключения :) ).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 10:51 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Edward Ivanov писал(а):
В секции finally никак проблем не может быть. Она как раз предотвращает проблемы, которые возникли благодаря случившемуся исключению. Например, отдать обратно выделенную память, закрыть дескрипторы файлов.
Проблем не будет, если Вы написали finally и вписали туда все освобождения.

А экскепшен может произойти в любой момент - типа той же нехватки памяти - в том месте, где вы финалли не предусмотрели. Или было лень написать. Или забыли про какой-то ресурс.

В КП память собирает сборщик мусора (100% гарантия сборки, программист ничего не пишет для этого); прочие ресурсы типа файлов закрываются в FINALIZE (программист реализует метод; вызовов не пишет; гарантия освобождения 100%).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 11:00 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Евгений Темиргалеев писал(а):
В КП память собирает сборщик мусора (100% гарантия сборки, программист ничего не пишет для этого); прочие ресурсы типа файлов закрываются в FINALIZE (программист реализует метод; вызовов не пишет; гарантия освобождения 100%).
Это всё верно.
Но остаются вопросы:
  • о своевременности возврата ресурсов;
  • о том, в каком месте программа реагирует на ошибку.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 11:21 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2463
Откуда: Россия, Томск
AVC писал(а):
Александр Ильин писал(а):
Неужели нельзя было при необходимости прерывания разбора сымитировать eof?
Я рассматривал подобный вариант в качестве альтернативы.
IMHO, в моем случае это не лучший выход.
Действительно, многие парсеры (компиляторов) не прекращают разбор при нахождении первой ошибки, а стараются собрать и выдать побольше информации. Если вся ошибка в том, что, скажем, пропущена точка с запятой, то компилятор даже может сгенерировать правильный код (с выдачей предупреждения, конечно).
В принципе, классические компиляторы Оберона придерживаются похожей стратегии. Для работы с ошибками в модуле сканера (OSS у Вирта, DevCPM в ББ) есть процедура Mark. HALT в DevCPM вызывается только при условии trap IN options.
Но у меня разбираются простые выражения (т.е. это язык запросов), такая подробность излишня. И причин отвергнуть запрос на самом деле больше (т.к. там еще может быть уже бессмысленное обращение к таблицам). Вот я и решил "огород не городить".
При чём здесь продолжение разбора после нахождения ошибки? Я предложил сымитировать получение eof. О каком продолжении разбора может идти речь после достижения конца входного потока? О каком "огороде" может идти речь, если вы в любом случае должы предусматривать достижение конца потока в каждый момент разбора?
AVC писал(а):
Наверное, подробнее эту тему имеет смысл разбирать уже в ветке, посвященной парсерам или компиляторам.
К нашей же теме имеет отношение тот факт, что в DLL, написанной на КП, я не знаю способа прервать выполнение, аналогичного исключению или HALT.
А я не знаю столь мощного и универсального средства как goto из одной процедуры в середину цикла другой, ну и что? % )


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 12:05 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Александр Ильин писал(а):
При чём здесь продолжение разбора после нахождения ошибки? Я предложил сымитировать получение eof. О каком продолжении разбора может идти речь после достижения конца входного потока? О каком "огороде" может идти речь, если вы в любом случае должы предусматривать достижение конца потока в каждый момент разбора?
Рассмотрим ситуацию.
Сканер вернул eot (или eof). Синтаксический разбор от этого не прекратился.
Хотя, действительно, он в конце концов "схлопнется". Так что можно было использовать eot/eof.
Ошибки в запросе у меня могут быть не только синтаксические. Конечно, можно научить сканер и в этом случае возвращать eot.
Так можно было сделать, но мне это показалось "кривым" (IMHO) и менее очевидным способом. Возможно, я и не прав.
Александр Ильин писал(а):
А я не знаю столь мощного и универсального средства как goto из одной процедуры в середину цикла другой, ну и что? % )
Я предлагал нечто подобное? :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 12:09 

Зарегистрирован: Понедельник, 05 Июнь, 2006 09:49
Сообщения: 327
Откуда: Ленинград, Емельянов Алексей Николаевич
Info21 писал(а):
Выигрышна в каком смысле?

Оберон-культура ("стратегия ассертов") требует подготовки (-),
но окупается производительностью при равной надежности (+).

Еще можно пообсуждать time-to-market против client satisfaction,
но производительность (time-to-market) у подкованного программостроителя всё равно заметно выше.

В зависимости от цели: захватить рынок или решить поставленную заказчиком задачу. Есть еще проблема сроков, но это близко к задаче "захватить рынок".
Кроме того, в чисто техническом плане, есть зависимость от этапа: разработка - эксплуатация. Хотя, кажется в ББ существует возможность перенастраивать поведение при Assert, но я про это плохо знаю.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 12:24 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2463
Откуда: Россия, Томск
Axcel писал(а):
Кроме того, в чисто техническом плане, есть зависимость от этапа: разработка - эксплуатация. Хотя, кажется в ББ существует возможность перенастраивать поведение при Assert, но я про это плохо знаю.
В модуле Kernel есть процедуры для перехвата исключений и установки своих обработчиков. ASSERT/HALT реализованы как выброс исключения.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 12:51 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1438
Александр Ильин писал(а):
А я не знаю столь мощного и универсального средства как goto из одной процедуры в середину цикла другой, ну и что? % )


Кстати межпроцедурный goto бывает реально полезен. ;) Например при поиске в дереве.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 15:28 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Иван Кузьмицкий писал(а):
Так что лучше придавать себе уверенности жёсткими проверками пред- и постусловий, нежели обёртывать всё и вся в try...except. Лучше, если ошибка проявит себя как можно раньше, а не будет задавлена обработчиком исключения.


Откуда такое противоставление "жёстких проверок пред- и постусловий" и исключений? ASSERT может быть вообще частным случаем исключения. Что касатется "всё и вся" в try/finally, то это особенность дельфи, потому что 95% finally там - это чистка памяти. В языках с GC (жаба/C#) или с возможностью автоматизированного управления памятью (C++) такого количества блоков try не требуется, за счет этого и достигается большая понятность (а значит и надежность) кода. В C++ даже finally как такового нет (потому что есть те самые деструкторы, о которых речь), так что try/catch надо еще поискать по исходникам :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 16:06 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Противопоставление только между "проверка предусловий в ASSERT" и "попыткой продолжить вычисления с помощью структурной обработки исключений".


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 16:27 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Иван Кузьмицкий писал(а):
Противопоставление только между "проверка предусловий в ASSERT" и "попыткой продолжить вычисления с помощью структурной обработки исключений".


Тогда это опять противопоставление "реальной жизни" и идеализиолванного мира оберона :) Ну вот дали вам обероновский модуль, без исходников, работает хорошо, только раз в сутки у клиента он падает с ASSERT'ом с номером 123. Ваши действия? Пойдете ковырять рантайм BB? Будете пинать разработчика? Перепишите все нафиг? Вобщем все опять упирается в "если есть, то можно не использовать, а если нет, то надо придумывать велосипед". Если есть механизм исключений, то его будут использовать только для "давки" ошибок. Если есть отладчик, то его будут использовать как средство убить время. И т.д.


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

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


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

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


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

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