А идет ли развитие в области альтернатив исключениям?
От: _hum_ Беларусь  
Дата: 25.03.16 10:20
Оценка:
В с++ в направлении усовершенствования исключений идет заметное движение. А как вообще в мире и в с++ в частности обстоит дело с развитием альтернатив исключениям (теми же кодами возвратов ошибок)?
Нет ли каких-нибудь подходов хотя бы с облегчением передачи и унификацией кодов возвратов, например? Или каких-нибудь замыканий (монад?), наподобие добавления к множеству возможных числовых результатов операций значения NaN, которое выводит деление на нуль из области исключительных ситуаций, и тем самым позволяет избавиться от уймы проверок на промежуточных этапах?
Re: А идет ли развитие в области альтернатив исключениям?
От: __kot2  
Дата: 25.03.16 15:57
Оценка: :)
в большинстве случаев возникновение исключения разрешается просто abort() процесса. как-то особого смысла городить какой-то огород и давать девелоперам строить логику тут нет
Re[2]: А идет ли развитие в области альтернатив исключениям?
От: _hum_ Беларусь  
Дата: 25.03.16 16:06
Оценка: +2
Здравствуйте, __kot2, Вы писали:

__>в большинстве случаев возникновение исключения разрешается просто abort() процесса. как-то особого смысла городить какой-то огород и давать девелоперам строить логику тут нет


вы серьезно?
Re[3]: А идет ли развитие в области альтернатив исключениям?
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 25.03.16 16:26
Оценка: +1
Здравствуйте, _hum_, Вы писали:

__>Здравствуйте, __kot2, Вы писали:


__>>в большинстве случаев возникновение исключения разрешается просто abort() процесса. как-то особого смысла городить какой-то огород и давать девелоперам строить логику тут нет


__>вы серьезно?

А что ещё сделать? В широком смысле если у тебя, например, отвалилась база, то ты должен рассматривать это как обычный кейс.
Sic luceat lux!
Re[4]: А идет ли развитие в области альтернатив исключениям?
От: _hum_ Беларусь  
Дата: 25.03.16 16:32
Оценка: +2
Здравствуйте, Kernan, Вы писали:

K>Здравствуйте, _hum_, Вы писали:


__>>Здравствуйте, __kot2, Вы писали:


__>>>в большинстве случаев возникновение исключения разрешается просто abort() процесса. как-то особого смысла городить какой-то огород и давать девелоперам строить логику тут нет


__>>вы серьезно?

K>А что ещё сделать? В широком смысле если у тебя, например, отвалилась база, то ты должен рассматривать это как обычный кейс.

есть понятие "живучести системы", которое, как и в живой природе, означает, что организм не должен умирать даже при серьезных потерях, не говоря уже о насморке.
Re[4]: А идет ли развитие в области альтернатив исключениям?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 25.03.16 17:27
Оценка: +1
Здравствуйте, Kernan, Вы писали:

__>>>в большинстве случаев возникновение исключения разрешается просто abort() процесса. как-то особого смысла городить какой-то огород и давать девелоперам строить логику тут нет

__>>вы серьезно?
K>А что ещё сделать? В широком смысле если у тебя, например, отвалилась база, то ты должен рассматривать это как обычный кейс.

Вот у меня сейчас, если отвалилась основная база, я должен начать кидать данные во временную локальную. Терять — нельзя. По подъёму связи с основной — вкачать в неё сложенное в локальной.
Хорош бы я был, если б по обрыву связи с основной допускал abort()...
The God is real, unless declared integer.
Re: А идет ли развитие в области альтернатив исключениям?
От: Evgeny.Panasyuk Россия  
Дата: 25.03.16 17:37
Оценка:
Здравствуйте, _hum_, Вы писали:

__>В с++ в направлении усовершенствования исключений идет заметное движение. А как вообще в мире и в с++ в частности обстоит дело с развитием альтернатив исключениям (теми же кодами возвратов ошибок)?

__>Нет ли каких-нибудь подходов хотя бы с облегчением передачи и унификацией кодов возвратов, например?

Есть некий симбиоз возвращаемых значений и исключений — expected<T>

__>Или каких-нибудь замыканий (монад?), наподобие добавления к множеству возможных числовых результатов операций значения NaN, которое выводит деление на нуль из области исключительных ситуаций, и тем самым позволяет избавиться от уймы проверок на промежуточных этапах?


Исключения это и есть монада, которая позволяет "избавиться от уймы проверок на промежуточных этапах"
Re[5]: А идет ли развитие в области альтернатив исключениям?
От: B0FEE664  
Дата: 25.03.16 17:59
Оценка: +1 :)
Здравствуйте, _hum_, Вы писали:

__>>>>в большинстве случаев возникновение исключения разрешается просто abort() процесса. как-то особого смысла городить какой-то огород и давать девелоперам строить логику тут нет

__>>>вы серьезно?
K>>А что ещё сделать? В широком смысле если у тебя, например, отвалилась база, то ты должен рассматривать это как обычный кейс.
__>есть понятие "живучести системы", которое, как и в живой природе, означает, что организм не должен умирать даже при серьезных потерях, не говоря уже о насморке.

Сразу видно, кто пишет системы, а кто приложения.

Сервисы, наверное, где между ними...
И каждый день — без права на ошибку...
Re[5]: А идет ли развитие в области альтернатив исключениям?
От: __kot2  
Дата: 25.03.16 19:53
Оценка: +1
Здравствуйте, _hum_, Вы писали:
__>есть понятие "живучести системы", которое, как и в живой природе, означает, что организм не должен умирать даже при серьезных потерях, не говоря уже о насморке.
простая система обычно более живуча, чем спагетти, пытающеися компенсировать какие-то баги
разговор на таком асбтрактном уровне конечно, как бы, странный, у каждого свое представление о приложениях, в некоторых случаях что и уместно делать, но в большинство гораздо лучше было бы, чтобы никаких исключений не было, просто завершался бы процесс, а не пытался бы симулировать деятельность, ломая данные. если вам кажется это глупостью — двавайте рассмотрим какой-то конкретный пример
Re[2]: А идет ли развитие в области альтернатив исключениям?
От: _hum_ Беларусь  
Дата: 25.03.16 21:12
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, _hum_, Вы писали:


__>>В с++ в направлении усовершенствования исключений идет заметное движение. А как вообще в мире и в с++ в частности обстоит дело с развитием альтернатив исключениям (теми же кодами возвратов ошибок)?

__>>Нет ли каких-нибудь подходов хотя бы с облегчением передачи и унификацией кодов возвратов, например?

EP>Есть некий симбиоз возвращаемых значений и исключений — expected<T>


выглядит страшнова-то.. а вот указанный boost::optional<T> уже "ближе", но все равно еще не то...

__>>Или каких-нибудь замыканий (монад?), наподобие добавления к множеству возможных числовых результатов операций значения NaN, которое выводит деление на нуль из области исключительных ситуаций, и тем самым позволяет избавиться от уймы проверок на промежуточных этапах?


EP>Исключения это и есть монада, которая позволяет "избавиться от уймы проверок на промежуточных этапах"


мм... может, я неправильно выразился. я имел ввиду подход, когда вместо того, чтобы считать a/0 неопределенностью, просто расширяют тип вещественных чисел за счет введения значения NaN, для которого полагается
a @ NaN -> NaN
NaN @ NaN -> NaN
(здесь @ — любая операция)

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

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

и в моем представлении монады — это именно подобие реализации механизма NaN.
Re[6]: А идет ли развитие в области альтернатив исключениям?
От: _hum_ Беларусь  
Дата: 25.03.16 21:27
Оценка:
Здравствуйте, __kot2, Вы писали:

__>Здравствуйте, _hum_, Вы писали:

__>>есть понятие "живучести системы", которое, как и в живой природе, означает, что организм не должен умирать даже при серьезных потерях, не говоря уже о насморке.
__>простая система обычно более живуча, чем спагетти, пытающеися компенсировать какие-то баги
__>разговор на таком асбтрактном уровне конечно, как бы, странный, у каждого свое представление о приложениях, в некоторых случаях что и уместно делать, но в большинство гораздо лучше было бы, чтобы никаких исключений не было, просто завершался бы процесс, а не пытался бы симулировать деятельность, ломая данные. если вам кажется это глупостью — двавайте рассмотрим какой-то конкретный пример

__kot2, вы наверное меня не поняли. речь не о том, что либо обрабатываем нештатные ситуации с помощью исключений, либо совсем не обрабатываем, а о том, как их обработать без исключений (я сам их противник, в первую очередь из-за нарушения принципов структурного программирования и как следствие образование "спагетти-кода"). "дедовский способ" — коды возврата ошибок и их анализ, наподобие
int modulo(int x, int m, int* result)
{
   int err_code = -1;// unknown error

   if(m > 0)
   {
      *result = x % m;

       err_code = 0;// ok. no error
   };

   return err_code;
}

int main(void)
{
   int x;
   int m;

   std::cin>>x;
   std::cin>>m;

   int res;

   const int err_code = modulo(x, m, &res);

   if(0 == err_code)
   {
     std::cout<<res;
   }
   else
  {
    std::cout<<"error";
  };
}



вот я и интересуюсь, что приниципиально нового с тех пор придумали-то?
Re[3]: А идет ли развитие в области альтернатив исключениям?
От: __kot2  
Дата: 25.03.16 21:30
Оценка:
Здравствуйте, _hum_, Вы писали:
__>в этом случае даже если у вас произойдет деление на нуль, поток управления все равно продолжит течь, как ни в чем не бывало
производя мусор
Вася сделает проверку на Нан, Петя забудет. правильнее все-таки падать
это же классика — мусор на входе, мусор на выходе. например, 3d max только и загнулся, что модели ломал при сохранении. когда возникала проблема, он, вместо того, чтобы сразу упасть, продолжал работать, ломая модель и похеривая работу (иногда и за несколько дней) дизайнера, сохраняя мусор
Отредактировано 25.03.2016 21:44 __kot2 . Предыдущая версия . Еще …
Отредактировано 25.03.2016 21:40 __kot2 . Предыдущая версия .
Re[7]: А идет ли развитие в области альтернатив исключениям?
От: __kot2  
Дата: 25.03.16 21:31
Оценка: +1
Здравствуйте, _hum_, Вы писали:
__>вот я и интересуюсь, что приниципиально нового с тех пор придумали-то?
ну, коды ошибок это вообще наркомания
конечно лучше кинуть исключение

но я против навороченной логики обработки их, попытки починить или восстановить состояние, проще будет упасть и полностью перезапуститься при желании
Re[4]: А идет ли развитие в области альтернатив исключениям?
От: _hum_ Беларусь  
Дата: 25.03.16 21:44
Оценка: -2
Здравствуйте, __kot2, Вы писали:

__>Здравствуйте, _hum_, Вы писали:

__>>в этом случае даже если у вас произойдет деление на нуль, поток управления все равно продолжит течь, как ни в чем не бывало
__>производя мусор

не мусор, а NaN значение в математике же тоже так сделали — положили a/0 равным oo (бесконечности), что упростило написание кучи математических текстов (вместо того, чтобы каждый раз в тексте оговаривать "кроме нуля").

__>Вася сделает проверку на Нан, Петя забудет. правильнее все-таки падать


если петя забудет, то в случае с NaN — получит работающую программу, выдающую результатом NaN, что лучше, чем падение, поскольку программа может попутно еще делать какие-то важные действия, никак не связанные с последствиями исключительной ситуации (например, отображение времени на экране монитора никак не связано с управлением искусственной вентиляцией легких больного, и "валить систему" только потому, что при расчете времени произошло деление на нуль — кощунство )
Re[5]: А идет ли развитие в области альтернатив исключениям?
От: __kot2  
Дата: 25.03.16 22:09
Оценка: +2 :)
Здравствуйте, _hum_, Вы писали:
__>не мусор, а NaN значение в математике же тоже так сделали — положили a/0 равным oo (бесконечности), что упростило написание кучи математических текстов (вместо того, чтобы каждый раз в тексте оговаривать "кроме нуля").
я мехмат закончил, это вы можете бабушке у подьезда заяснить, что a/0 равно бесконечности. в реальности конечно же ничего подобного в математике нет

__>если петя забудет, то в случае с NaN — получит работающую программу, выдающую результатом NaN, что лучше, чем падение, поскольку программа может попутно еще делать какие-то важные действия, никак не связанные с последствиями исключительной ситуации (например, отображение времени на экране монитора никак не связано с управлением искусственной вентиляцией легких больного, и "валить систему" только потому, что при расчете времени произошло деление на нуль — кощунство )

а зач6м Петя свалил в один процесс отображение времени на экране и вентиляцию легких? он у нас дурачок-с?

вы наверное намекаете, что в "новых современных" языках программирования, типа жабоскрипта есть Nan? да есть, но такие языки часто спроектированы школьником-дурачком Петей для себя, чтобы ему было удобнее, а совсем не для того, чтобы работать быстро и надежно. удобно иметь Nan? удобно. но это в ущерб стиабильности работы. где нас это устраивает? в гуе, например, более-менее. хотя я бы предпочел все-таки в каком-то медицинском или финансовом гуе, чтобы инфа все-таки были или 100% корректной или никакой, а не "корректной, но не всегда"
Отредактировано 25.03.2016 22:17 __kot2 . Предыдущая версия .
Re[6]: А идет ли развитие в области альтернатив исключениям?
От: _hum_ Беларусь  
Дата: 25.03.16 22:44
Оценка:
Здравствуйте, __kot2, Вы писали:

__>Здравствуйте, _hum_, Вы писали:

__>>не мусор, а NaN значение в математике же тоже так сделали — положили a/0 равным oo (бесконечности), что упростило написание кучи математических текстов (вместо того, чтобы каждый раз в тексте оговаривать "кроме нуля").

__>я мехмат закончил, это вы можете бабушке у подьезда заяснить, что a/0 равно бесконечности. в реальности конечно же ничего подобного в математике нет







__>>если петя забудет, то в случае с NaN — получит работающую программу, выдающую результатом NaN, что лучше, чем падение, поскольку программа может попутно еще делать какие-то важные действия, никак не связанные с последствиями исключительной ситуации (например, отображение времени на экране монитора никак не связано с управлением искусственной вентиляцией легких больного, и "валить систему" только потому, что при расчете времени произошло деление на нуль — кощунство )

__>а зач6м Петя свалил в один процесс отображение времени на экране и вентиляцию легких? он у нас дурачок-с?

не отображение, а расчет отображаемого времени (сколько времени прошло с момента начала вентиляции, например) а вообще, вам как математику вроде бы должен быть близок принцип аналогии. нет?

__>вы наверное намекаете, что в "новых современных" языках программирования, типа жабоскрипта есть Nan? да есть, но такие языки часто спроектированы школьником-дурачком Петей для себя, чтобы ему было удобнее, а совсем не для того, чтобы работать быстро и надежно. удобно иметь Nan? удобно. но это в ущерб стиабильности работы. где нас это устраивает? в гуе, например, более-менее. хотя я бы предпочел все-таки в каком-то медицинском или финансовом гуе, чтобы инфа все-таки были или 100% корректной или никакой, а не "корректной, но не всегда"


я хочу подчеркнуть, что я лишь говорил о возможных вариантах, но не называл их идеальными
Re[6]: А идет ли развитие в области альтернатив исключениям?
От: BulatZiganshin  
Дата: 25.03.16 23:07
Оценка: -1
Здравствуйте, __kot2, Вы писали:

__>я мехмат закончил


вот и работал бы профи-математиком, а не дилетантом-программистом

__>вы наверное намекаете, что в "новых современных" языках программирования, типа жабоскрипта есть Nan? да есть, но такие языки часто спроектированы школьником-дурачком Петей для себя, чтобы ему было удобнее, а совсем не для того, чтобы работать быстро и надежно.


https://en.wikipedia.org/wiki/IEEE_floating_point реализован во всех современных cpu/gpu
Люди, я люблю вас! Будьте бдительны!!!
Re[7]: А идет ли развитие в области альтернатив исключениям?
От: __kot2  
Дата: 25.03.16 23:30
Оценка: +2 -1
Здравствуйте, _hum_, Вы писали:
__>Image: f3951f298dd5dad1cf532ab7e6e7c5b9.png
__>
что это за картинка?
у математики много разделов. единственный раздел, который оперирует с бесконечностями это ТФКП, но там есть свои собственные заморочки и a там комплексная и на плоскости, поэтому минус бесконечности, например, есчли не ошибаюсь, нет

с точки зрения матана бесконечность — процесс
и деля на бесконечность можно получить в итоге процесса что угодно, хоть 42. сама бесконечно не может принадлежать ни какому из множества чисел, чтобы не ломать кучу аксиом и теорем.

с точки зрения матлогики бесконечности их характеристики множеств и они делятся по мощности и не рассматриваются в отрыве от множеств. она не одна, их несколько. как минимум есть счетная, есть несчетная. арифметические операции в матлогике нафиг не нужны.

так что я понять не могу из какого раздела эта картинка. для решебника 8ого класса какой-то школы со своей программой?

__>не отображение, а расчет отображаемого времени (сколько времени прошло с момента начала вентиляции, например) а вообще, вам как математику вроде бы должен быть близок принцип аналогии. нет?

была история одна известная про чела, который писал софт для ренгтеновского, по-моему аппарата. он bool когда хотел в истину взвести, просто его инкрементил. ну, хацкер, чего с него взять. из-за этого в 1 из 256 случаев внизапна bool становился false после инкремента и куча человек получила переоблучение.

нормальный софт должен делать abort() когда у тебя вдруг bool стал равен 2. ненормальный — может продолжать работать, пытаясь сохранить хорошую мину при плохой игре.
в случае же какого-то аппарата вентиляции легких или еще чего-то обычно ставят watchdog, который перезагружает софт при его падении или отсуствии отклика. или же можно переключиться на резервное устройство. может, текущее просто перегрелось. софт, который не падает и не виснет, а продолжает что-то там делать непонятное, неизвестное и малопредсказуемое, например, вдруг увеличивает или уменьшает скорости вентиляции в три раза, просто не нужен.
Re[7]: А идет ли развитие в области альтернатив исключениям?
От: __kot2  
Дата: 25.03.16 23:32
Оценка:
Здравствуйте, BulatZiganshin, Вы писали:
BZ>https://en.wikipedia.org/wiki/IEEE_floating_point реализован во всех современных cpu/gpu
я в курсе про этот Nan, я просто не считаю, что с ним нужно продолжать работать
Re: А идет ли развитие в области альтернатив исключениям?
От: velkin Удмуртия http://blogs.rsdn.org/effective/
Дата: 25.03.16 23:36
Оценка:
Здравствуйте, _hum_, Вы писали:

__>В с++ в направлении усовершенствования исключений идет заметное движение. А как вообще в мире и в с++ в частности обстоит дело с развитием альтернатив исключениям (теми же кодами возвратов ошибок)?


Это очень древняя тема, например, программирование COM/DCOM.
Роджерсон Дейл: Основы COM; 6. HRESULT GUID, Реестр и другие детали

HRESULT

Во всех самолетах есть приборы, и самодельные самолеты — не исключение. Хотя в некоторых таких самолетах роль приборов играет компьютер с цветным графическим дисплеем (иногда даже «под» Windows NT), обычно ставят что-нибудь подешевле. Металлическая полоса, например, — простейший индикатор скорости. Чем быстрее Вы летите, тем сильнее она изгибается.

Хотя приборы и могут сообщить в деталях, что происходит с самолетом и отдельными системами, их основное назначение — предупреждать об опасности. На индикаторе скорости есть красная полоска, отмечающая слишком высокую (или низкую) скорость. Часто приборы снабжают аварийными лампочками и зуммерами.

У компонентов СОМ нет приборов. Вместо шкал или лампочек для сообщений о текущем состоянии дел они используют HRESULT. QueryInterface вращает HRESULT. И, как мы увидим в оставшейся части книги, большинство функций интерфейсов СОМ также возвращает HRESULT. Xoтя из названия HRESULT можно было бы заключить, что это описатель (handle) результата, на самом деле это не так. HRESULT — это 32-разрядное значение, разделенное на три поля. Значения полей, составляющих HRESULT поясняет рис. 6-1. Название возникло по историческим причинам; расшифровывайте его как «вот результат» (here's the, result), а не «описатель результата» (handle of result).

Определенные системой значения HRESULT содержатся в заголовочном файле Win32 WINERROR.H. В начале файла расположены коды ошибок Win32, так что его нужно пролистать, чтобы добраться до HRESULT похож на код ошибки Win32, но это не одно и то же, и смешивать их не следует.

Старший бит HRESULT, как показано на рис. 6-1, отмечает, успешно или нет выполнена функция. Это позволяет определить много кодов возврата и для успеха, и для неудачи. Последние 16 битов содержат собственно код возврата. Остальные 15 битов содержат дополнительную информацию о типе и источнике кода ошибки.

В табл. 6-1 приведены наиболее часто используемые коды. По соглашению в названиях успешных кодов возврата содержится S_, а в названиях кодов ошибок — Е_.

Таблица 6-1. Распространенные значения HRESULT
Название Значение
S_OK Функция отработала успешно. В некоторых случаях этот код также означает, что функция возвращает логическую истину. Значение S_OK равно 0.
NOERROR Тоже,что S_ОК.
S_FALSE Функция отработала успешно и возвращает логическую ложь. Значение S_FALSE равно 1.
E_UNEXPECTED Неожиданная ошибка.
E_NOTIMPL Метод не реализован.
E_NOINTERFACE Компонент не поддерживает запрашиваемый интерфейс. Возвращается QueryInterface.
E_OUTOFMEMORY Компонент не может выделить требуемый объем памяти.
E_FAIL Ошибка по неуказанной причине.

Обратите внимание, что значение S_FALSE равно 1, а значение S_OK — 0. Это противоречит обычной практике программирования на C/C++, где 0 — это ложь, а не 0 — истина. Поэтому при использовании HRESULT обязательно явно сравнивайте коды возврата с S_FALSE или S_OK.

Пятнадцать битов — с 30-го по 16-й — содержат идентификатор средства (facility). Он указывает, какая часть операционной системы выдает данный код возврата.

И так далее.
Re[2]: А идет ли развитие в области альтернатив исключениям?
От: __kot2  
Дата: 25.03.16 23:46
Оценка: :)
Здравствуйте, velkin, Вы писали:
V>Это очень древняя тема, например, программирование COM/DCOM.
V>Роджерсон Дейл: Основы COM; 6. HRESULT GUID, Реестр и другие детали
V>[q]
V>HRESULT
COM, кстати, отличный пример того, как делать не надо. всех причастных к его разработке стоило бы отправить копать Беломорканал за вредительство
Re[8]: А идет ли развитие в области альтернатив исключениям?
От: _hum_ Беларусь  
Дата: 25.03.16 23:54
Оценка: :)
Здравствуйте, __kot2, Вы писали:

__>Здравствуйте, _hum_, Вы писали:

__>>Image: f3951f298dd5dad1cf532ab7e6e7c5b9.png
__>>
__>что это за картинка?
__>у математики много разделов. единственный раздел, который оперирует с бесконечностями это ТФКП, но там есть свои собственные заморочки и a там комплексная и на плоскости, поэтому минус бесконечности, например, есчли не ошибаюсь, нет

wiki/Extended_real_number_line

ваша ошибка в том, что вы считаете себя здесь единственным знакомым с высшей математикой

__>с точки зрения матана бесконечность — процесс


нет. в матане есть два понятия — потенциальная (и это действительно бесконечный процесс) и абсолютная (предел) бесконечности

__>и деля на бесконечность можно получить в итоге процесса что угодно, хоть 42. сама бесконечно не может принадлежать ни какому из множества чисел, чтобы не ломать кучу аксиом и теорем.


нельзя, поскольку как lim a/n, n -> +oo, так и a/+oo — оба равны нулю.

__>с точки зрения матлогики бесконечности их характеристики множеств и они делятся по мощности и не рассматриваются в отрыве от множеств. она не одна, их несколько. как минимум есть счетная, есть несчетная. арифметические операции в матлогике нафиг не нужны.


речь не шла про кардинальные числа и ординалы высших порядков. речь шла про расширение числовой прямой

__>так что я понять не могу из какого раздела эта картинка. для решебника 8ого класса какой-то школы со своей программой?


первый курс, начала матанализа

__>>не отображение, а расчет отображаемого времени (сколько времени прошло с момента начала вентиляции, например) а вообще, вам как математику вроде бы должен быть близок принцип аналогии. нет?

__>была история одна известная про чела, который писал софт для ренгтеновского, по-моему аппарата. он bool когда хотел в истину взвести, просто его инкрементил. ну, хацкер, чего с него взять. из-за этого в 1 из 256 случаев внизапна bool становился false после инкремента и куча человек получила переоблучение.

к чему это?

__>нормальный софт должен делать abort() когда у тебя вдруг bool стал равен 2. ненормальный — может продолжать работать, пытаясь сохранить хорошую мину при плохой игре.

__>в случае же какого-то аппарата вентиляции легких или еще чего-то обычно ставят watchdog, который перезагружает софт при его падении или отсуствии отклика. или же можно переключиться на резервное устройство. может, текущее просто перегрелось. софт, который не падает и не виснет, а продолжает что-то там делать непонятное, неизвестное и малопредсказуемое, например, вдруг увеличивает или уменьшает скорости вентиляции в три раза, просто не нужен.

мды...
Re[2]: А идет ли развитие в области альтернатив исключениям?
От: _hum_ Беларусь  
Дата: 25.03.16 23:55
Оценка:
Здравствуйте, velkin, Вы писали:

V>Здравствуйте, _hum_, Вы писали:


__>>В с++ в направлении усовершенствования исключений идет заметное движение. А как вообще в мире и в с++ в частности обстоит дело с развитием альтернатив исключениям (теми же кодами возвратов ошибок)?


V>Это очень древняя тема, например, программирование COM/DCOM.

[...]
V>И так далее.

ну так я и хотел узнать, во что она в 21 веке эволюционировала
Re[3]: А идет ли развитие в области альтернатив исключениям?
От: velkin Удмуртия http://blogs.rsdn.org/effective/
Дата: 26.03.16 00:12
Оценка:
Здравствуйте, __kot2, Вы писали:

__>COM, кстати, отличный пример того, как делать не надо. всех причастных к его разработке стоило бы отправить копать Беломорканал за вредительство


Это да

И всё же заложенные идеи у майкрософт были хороши. Другое дело, что программировать всё это хозяйство очень тяжело. Реализация подкачала в том смысле, что была создана не для людей программистов. Впрочем CORBA тоже провалилась. С другой стороны данный пример можно вполне использовать для изучения принципов работы с возвратом кодов ошибок. Ведь по сути для этого нужен какой-нибудь большой известный фреймворк, в нашем случае ещё и на C++. В том же Qt есть другой подход к кодам ошибок, для примера, QSqlError. А вот если не брать известные фреймворки, то с таким же успехом можно выдумывать обработку ошибок самим.
Re[9]: А идет ли развитие в области альтернатив исключениям?
От: __kot2  
Дата: 26.03.16 00:12
Оценка:
Здравствуйте, _hum_, Вы писали:
__>ваша ошибка в том, что вы считаете себя здесь единственным знакомым с высшей математикой
я надеюсь, что тут вообще с ней все знакомы или по-крайней мере собираются познакомиться после окончания школы

__>нет. в матане есть два понятия — потенциальная (и это действительно бесконечный процесс) и абсолютная (предел) бесконечности

у нас разные курсы матана были.

__>нельзя, поскольку как lim a/n, n -> +oo, так и a/+oo — оба равны нулю.

а если а = n*42?
в матане рассмотрение пределов, когда у нас обе части дроби стремятся к нулю или бесконечности это же любимое дело, полматана этим занимается. просто провозгласить, что типа есть бесконечность и вот вам операции с ней это какая-то хрень по-моему.

__>речь не шла про кардинальные числа и ординалы высших порядков. речь шла про расширение числовой прямой

не вижу смысла. то есть может быть кто-то это использует, но не думаю, что широко и непонятно зачем вообще это надо. всю жизнь обходился без этого. в матане не важно, что ряд идет в бесконечность, важно, как он идет
Отредактировано 26.03.2016 0:15 __kot2 . Предыдущая версия .
Re[3]: А идет ли развитие в области альтернатив исключениям?
От: velkin Удмуртия http://blogs.rsdn.org/effective/
Дата: 26.03.16 00:42
Оценка:
Здравствуйте, _hum_, Вы писали:

__>ну так я и хотел узнать, во что она в 21 веке эволюционировала


В популярных библиотеках как-то не заметил особой разницы от того, что было ранее. Есть обработка исключительных ситуация в стиле Си, а есть в стиле С++. И там, и там от библиотеки к библиотеке просто меняется формат данных, но не основные принципы. Так то даже непонятно во что это может эволюционировать.

Конечно, я слишком вольно всё это трактую, называю обсуждаемое понятие, то ошибками, то исключениями. Исключения не являются ошибками, и нужны лишь для передачи информации программисту о возникновении исключительных ситуаций чтобы он мог написать свой собственный обработчик. Таким образом как не извращайся, а вариантов не так много.
Re[10]: А идет ли развитие в области альтернатив исключениям?
От: _hum_ Беларусь  
Дата: 26.03.16 01:29
Оценка:
Здравствуйте, __kot2, Вы писали:

__>Здравствуйте, _hum_, Вы писали:



__>>нет. в матане есть два понятия — потенциальная (и это действительно бесконечный процесс) и абсолютная (предел) бесконечности

__>у нас разные курсы матана были.

__>>нельзя, поскольку как lim a/n, n -> +oo, так и a/+oo — оба равны нулю.

__>а если а = n*42?

не может такого быть, поскольку в правой части у вас величина, зависящая от n, а в левой — константа (в противном случае бы писалось a(n) или a_n, вам ли как математику этого не знать)

__>в матане рассмотрение пределов, когда у нас обе части дроби стремятся к нулю или бесконечности это же любимое дело, полматана этим занимается. просто провозгласить, что типа есть бесконечность и вот вам операции с ней это какая-то хрень по-моему.


__>>речь не шла про кардинальные числа и ординалы высших порядков. речь шла про расширение числовой прямой

__>не вижу смысла. то есть может быть кто-то это использует, но не думаю, что широко и непонятно зачем вообще это надо. всю жизнь обходился без этого. в матане не важно, что ряд идет в бесконечность, важно, как он идет

вообще-то все используют, начиная с первого курса: в расширенной числовой прямой предел lim n, n->oo равен oo, а не "не существует", как в случае обычной прямой

более того, комплексные числа появились именно по той же причине — хотелось сделать так, чтобы все алгебраические операции были "без эксепшенов"
Re[4]: А идет ли развитие в области альтернатив исключениям?
От: _hum_ Беларусь  
Дата: 26.03.16 01:31
Оценка:
Здравствуйте, velkin, Вы писали:

V>Здравствуйте, _hum_, Вы писали:


__>>ну так я и хотел узнать, во что она в 21 веке эволюционировала


V>В популярных библиотеках как-то не заметил особой разницы от того, что было ранее. Есть обработка исключительных ситуация в стиле Си, а есть в стиле С++. И там, и там от библиотеки к библиотеке просто меняется формат данных, но не основные принципы. Так то даже непонятно во что это может эволюционировать.


V>Конечно, я слишком вольно всё это трактую, называю обсуждаемое понятие, то ошибками, то исключениями. Исключения не являются ошибками, и нужны лишь для передачи информации программисту о возникновении исключительных ситуаций чтобы он мог написать свой собственный обработчик. Таким образом как не извращайся, а вариантов не так много.


на самом деле идеи интересные есть. те же монады (но я пока с ними не разобрался )
Re[11]: А идет ли развитие в области альтернатив исключениям?
От: __kot2  
Дата: 26.03.16 02:30
Оценка:
Здравствуйте, _hum_, Вы писали:
__> вообще-то все используют, начиная с первого курса: в расширенной числовой прямой предел lim n, n->oo равен oo, а не "не существует", как в случае обычной прямой
расширение-доопределение ф-ий для более широкого набора аргументов это, на самом деле круто. меня в свое сильно удивило расширение факториала гамма-функцией. это прямо мощь. но давайте мы попробуем доопределить, скажем 1/x в нуле, нашей, значит, бесконечностью. хорошо, какой? плюс или минус? получается, у нас плюс бесконечность равна минус, а, значит, мы переходим к комплексным числам вместо простых ламповых вещественных?
хорошо ли это? нет, это нехорошо. мы, не можем, например, их упорядочить между собой. нам придется пересмотреть все наши формулы со знаками меньше-больше, например. комплексные числа — это неудобные числа. вместо упрощения ситуации мы создаем себе геморрой на ровном месте.

__>более того, комплексные числа появились именно по той же причине — хотелось сделать так, чтобы все алгебраические операции были "без эксепшенов"

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

мне лично никогда не понятно было, к чему такое внимание к двухкомпонентным, которые почему-то именно на плоскости. математика не любит таких конкретностей. вводя бесконечность мы теряем возможность сравнивать числа и переходим из абстрактной математики над произвольными множествами и размерностями к велосипедной на плоскости.
Re[12]: А идет ли развитие в области альтернатив исключениям?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 26.03.16 05:06
Оценка:
Здравствуйте, __kot2, Вы писали:

__>расширение-доопределение ф-ий для более широкого набора аргументов это, на самом деле круто. меня в свое сильно удивило расширение факториала гамма-функцией. это прямо мощь. но давайте мы попробуем доопределить, скажем 1/x в нуле, нашей, значит, бесконечностью. хорошо, какой? плюс или минус? получается, у нас плюс бесконечность равна минус, а, значит, мы переходим к комплексным числам вместо простых ламповых вещественных?


Почему? Числовая окружность вместо прямой, но ещё не комплексные.

__>мне лично никогда не понятно было, к чему такое внимание к двухкомпонентным, которые почему-то именно на плоскости.


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

За 3000 лет до этого точно так же понимание, что сложнейшие явления можно уложить на натуральные числа и при этом не сильно потерять в эффективности результата, было новым, неожиданным и вызывало религиозные возражения, часть которых дожила до наших дней.
The God is real, unless declared integer.
Re[11]: А идет ли развитие в области альтернатив исключениям?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 26.03.16 05:08
Оценка:
Здравствуйте, _hum_, Вы писали:

__> вообще-то все используют, начиная с первого курса: в расширенной числовой прямой предел lim n, n->oo равен oo, а не "не существует", как в случае обычной прямой


Не по сути, но по форме — у вас же наверняка у компьютера внутри юникод?
что мешает использовать символ "∞" (U+221E)?
The God is real, unless declared integer.
Re[5]: А идет ли развитие в области альтернатив исключениям?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 26.03.16 05:31
Оценка:
Здравствуйте, _hum_, Вы писали:

__>>Здравствуйте, _hum_, Вы писали:

__>>>в этом случае даже если у вас произойдет деление на нуль, поток управления все равно продолжит течь, как ни в чем не бывало
__>>производя мусор
__>не мусор, а NaN значение

Придерусь — не NaN, а Inf. Это разные значения. В остальном согласен.
The God is real, unless declared integer.
Re[6]: А идет ли развитие в области альтернатив исключениям?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 26.03.16 05:37
Оценка:
Здравствуйте, __kot2, Вы писали:

__>Здравствуйте, _hum_, Вы писали:

__>>не мусор, а NaN значение в математике же тоже так сделали — положили a/0 равным oo (бесконечности), что упростило написание кучи математических текстов (вместо того, чтобы каждый раз в тексте оговаривать "кроме нуля").
__>я мехмат закончил, это вы можете бабушке у подьезда заяснить, что a/0 равно бесконечности. в реальности конечно же ничего подобного в математике нет

Считайте это лёгким личным наездом, но именно тот факт, что это был мехмат, а не примат, кибернетика или что-то подобное, меня как раз и вводит в "смутные сомнения" о том, что Вы понимаете, что происходит и что должно быть.
Потому что обычно только после курса моделирования студент начинает понимать, что математика только тогда имеет смысл, когда моделирование сделано правильно.
Что натуральные числа это хорошо ровно настолько, насколько мы можем, например, считать все яблоки по 1 штуке, игнорируя, насколько одно больше, слаще или червивее другого (и даже оценить, какие погрешности получаются при таком игнорировании).
Почему старая шутка "стоящие часы полезнее, потому что хотя бы дважды в сутки показывают точное время" хороша только как средство для объяснения, что такое ложный парадокс, и должна стоять рядом с апориями Зенона.
И тэ дэ и тэ пэ.
Да, я тут однозначно на стороне прикладной математики. Можете кинуть цифровым камнем.

В этом смысле решение, чему равно 1/0 — вообще не существует, ∞ без знака, +∞ или ещё чему-то — просто выбор контекста для работы, и контекст, где это противоположное нулю значение на числовой окружности, не менее важен, чем тот, где значения не существует. Он просто другой.

__>>если петя забудет, то в случае с NaN — получит работающую программу, выдающую результатом NaN, что лучше, чем падение, поскольку программа может попутно еще делать какие-то важные действия, никак не связанные с последствиями исключительной ситуации (например, отображение времени на экране монитора никак не связано с управлением искусственной вентиляцией легких больного, и "валить систему" только потому, что при расчете времени произошло деление на нуль — кощунство )

__>а зач6м Петя свалил в один процесс отображение времени на экране и вентиляцию легких? он у нас дурачок-с?

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

__>вы наверное намекаете, что в "новых современных" языках программирования, типа жабоскрипта есть Nan? да есть, но такие языки часто спроектированы школьником-дурачком Петей для себя, чтобы ему было удобнее, а совсем не для того, чтобы работать быстро и надежно.


"Новые языки" тут ни при чём. Возведение 1e200 в double в квадрат выдаст +Inf даже в Фортране, если платформа по IEEE754 и режим округления не трогали. Странности реализации JS с этим никак не связаны, там много другого хитрого.
Я всё тоскую, что не сохранил скриншот, где номер банковской карточки выводился в виде 5.3762e+16 — удобный аргумент в некоторых спорах но опять же это number vs. string, а не float vs. integer.

__> удобно иметь Nan? удобно. но это в ущерб стиабильности работы. где нас это устраивает? в гуе, например, более-менее.


Повторяю: это обеспечить тривиально, если вызвать, в терминах языка Си, feenableexcept(FE_OVERFLOW|FE_DIVBYZERO). Сделайте — и первое же переполнение вызовет исключение (будет это SIGFPE, как по умолчанию в Unix, переведётся в SEH или как-то ещё передастся — это уже за пределами стандартов, но как-то будет). Для других языков не знаю, но в C#, наверно, checked покрывает эту тему.

__> хотя я бы предпочел все-таки в каком-то медицинском или финансовом гуе, чтобы инфа все-таки были или 100% корректной или никакой, а не "корректной, но не всегда"


Оно так и будет. Просто где-то будет исключение сразу, а где-то надо самому проверить, что NaN не возник в данных и/или не перепутан с реальным значением, и проверки сделаны правильно (например, с плавучкой нельзя автоматически считать, что если a>b, то b<a, потому что есть четвёртый случай — несравнимость).
The God is real, unless declared integer.
Re[9]: А идет ли развитие в области альтернатив исключениям?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 26.03.16 06:03
Оценка:
Здравствуйте, _hum_, Вы писали:

__>>с точки зрения матана бесконечность — процесс

__>нет. в матане есть два понятия — потенциальная (и это действительно бесконечный процесс) и абсолютная (предел) бесконечности

s/абсолютная/актуальная/
The God is real, unless declared integer.
Re[3]: А идет ли развитие в области альтернатив исключениям?
От: Evgeny.Panasyuk Россия  
Дата: 26.03.16 06:28
Оценка: +1
Здравствуйте, _hum_, Вы писали:

EP>>Есть некий симбиоз возвращаемых значений и исключений — expected&lt;T&gt;

__>выглядит страшнова-то.. а вот указанный boost::optional<T> уже "ближе", но все равно еще не то...

От Optional отличие только в том, что внутри могут хранится разные исключения, а не только bad_optional_access.

__>>>Или каких-нибудь замыканий (монад?), наподобие добавления к множеству возможных числовых результатов операций значения NaN, которое выводит деление на нуль из области исключительных ситуаций, и тем самым позволяет избавиться от уймы проверок на промежуточных этапах?

EP>>Исключения это и есть монада, которая позволяет "избавиться от уймы проверок на промежуточных этапах"
__>мм... может, я неправильно выразился. я имел ввиду подход, когда вместо того, чтобы считать a/0 неопределенностью, просто расширяют тип вещественных чисел за счет введения значения NaN, для которого полагается
__> a @ NaN -> NaN
__> NaN @ NaN -> NaN
__>(здесь @ — любая операция)

Это аппликативный функтор, а не монада.

__>в этом случае даже если у вас произойдет деление на нуль, поток управления все равно продолжит течь, как ни в чем не бывало, предоставляя вам свободу выбора, где делать проверку на валидность соответствующего значения.


Монада в этом контексте как раз и отличается от аппликативного функтора тем что может прервать поток управления, так как весь этот поток управления протекает через неё.

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


Вообще-то наоборот — с исключениями мы имеем обычную логику не замусоренную проверками и обработками. Обработка же обычно происходит где-то наверху стэка.
Re: А идет ли развитие в области альтернатив исключениям?
От: LaptevVV Россия  
Дата: 26.03.16 06:33
Оценка:
__>В с++ в направлении усовершенствования исключений идет заметное движение. А как вообще в мире и в с++ в частности обстоит дело с развитием альтернатив исключениям (теми же кодами возвратов ошибок)?
Да дело не в инструменте как таковом.
Если ты для каждого состояния системы рассмотришь не только рабочие состояния, но и аварийные...
Если ты рассклассифицируешь эти аварийные состояния по степени тяжести...
Если ты спроектируешь реакцию системы в каждом классе аварийных состояний...
Если ты напишешь все сообщения для аварийных состояний...
Тогда можно посмотреть в сторону инструмента — как это все реализовать.
ИМХО в этом случае аппарата исключений вполне достаточно.
А в системах реального времени — коды возврата (если средство разработки для этого подходящее)
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[7]: А идет ли развитие в области альтернатив исключениям?
От: __kot2  
Дата: 26.03.16 08:00
Оценка: :)
Здравствуйте, netch80, Вы писали:
N>В этом смысле решение, чему равно 1/0 — вообще не существует, ∞ без знака, +∞ или ещё чему-то — просто выбор контекста для работы, и контекст, где это противоположное нулю значение на числовой окружности, не менее важен, чем тот, где значения не существует. Он просто другой.
если вы когда-нибудь брали какой-нибудь большой интеграл или пытаись доказать хитрую теорему, то вы знаете, что маааленькая ошибочка где-то посредине рассуждений аннулирует все рассуждения.

вы не можете дополнить вещественные числа двумя бесконечностями, так как, например, дополнение 1/x в нуле противоречит определению ф-ии.
вы не можете дополнить вещественные числа одной бесконечностью и сохранить их упорядоченность, то есть не можете пользоваться другими свойствами вещ. чисел, так как inf < x < inf.
а еще, кстати, введение бесконечности противоречит определению нуля. поэтому в таких числах нуля быть не может. вы можете ввести свой ноль, но это будет другой ноль и вы должны пользоваться другим его обозначением.

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

вы можете перейти к комплексным, но вы не получите числа "без эксепшенов", как минимум вам не удастся определить модуль бесконечности, либо же модуль у вас будет комплексным и бесполезным

у меня есть подозрения, что, по-аналогии, возможность проводить операции с nan тоже фундаментально абсурдны, как и факт иметь обьект в невалидном состоянии вообще. мы не можем иметь int имеющий одновременно и плюс и минус. мы не можем иметь букву, которая одновременно и а и б. мы не можем иметь строку ненулевой длины начинающейся с 0. мы не можем иметь bool, который одновременно true и false. то есть мы все это можем сделать, но все это будут обьекты в невалидном состоянии. и вместо того, чтобы писать код для каждого из таких случаев, нам было бы в сто раз удобнее не допускать такое состояние вообще. возникновение такого состояния — abort()
Отредактировано 26.03.2016 8:32 __kot2 . Предыдущая версия . Еще …
Отредактировано 26.03.2016 8:29 __kot2 . Предыдущая версия .
Re[8]: А идет ли развитие в области альтернатив исключениям?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 26.03.16 08:34
Оценка:
Здравствуйте, __kot2, Вы писали:

__>Здравствуйте, netch80, Вы писали:

N>>В этом смысле решение, чему равно 1/0 — вообще не существует, ∞ без знака, +∞ или ещё чему-то — просто выбор контекста для работы, и контекст, где это противоположное нулю значение на числовой окружности, не менее важен, чем тот, где значения не существует. Он просто другой.
__>если вы когда-нибудь брали какой-нибудь большой интеграл или пытаись доказать хитрую теорему, то вы знаете, что маааленькая ошибочка где-то посредине рассуждений аннулирует все рассуждения.

Да. Но при чём тут это? Если посреди вычислений возникнет Inf (которое в IEEE754 означает не бесконечность вообще, а "значение, не поместившееся в стандартные размеры, или его потомок в операциях"), то, если это Inf не будет скомпенсировано тем, что где-то оно вообще неважно, так и останется Inf, то есть признаком "когда-то было переполнение". Аналогично для NaN. У вас не возникнет неожиданно корректно выглядящего, но неправильного значения, только за счёт того, что где-то раньше были Inf или NaN.

__>вы не можете дополнить вещественные числа двумя бесконечностями, так как, например, дополнение 1/x в нуле противоречит определению ф-ии.


Мнэээ... подробнее, пожалуйста. Функция, насколько я помню, это отображение, которое для каждого прообраза из области определения даёт один и только один образ из области значений. Так?
И каким же образом это дополнение противоречит определению функции, если для f(x)=1/x
1) мы добавляем значения 0 и ∞ в обе области (определения и значения);
2) функция переводит их друг в друга;
3) значение функции для любого другого значения из ℝ этим не меняется
?

__>вы не можете дополнить вещественные числа одной бесконечностью и сохранить их упорядоченность,


А кто говорил про такую же линейную упорядочённость, и что она в этом случае должна сохраняться? Естественно, я не требую её сохранения (в том же виде) в случае включения ∞.

__> то есть не можете пользоваться другими свойствами вещ. чисел, так как inf < x < inf.


Могу. С соответствующими уточнениями. Вас же не приводит в ступор, например, то, что для комплексных чисел уже нельзя определить стандартные сравнения типа "меньше"? Или что квадратный корень ℝ->ℝ почему-то в друг при выходе в ℝ⁻ перестаёт работать? Почему там могут возникать уточнения, а тут — нет?

__>все ваши рассуждения, которые вы построите на базе этих чисел, будут неправильными с самого начала, соверенно не важно, какими красивыми они будут


Будут правильными. Важна внутренняя согласованность понятий и концепций, а она в описываемом случае есть.

__>у меня есть подозрения, что, по-аналогии, возможность проводить операции с nan тоже фундаментально абсурдны, как и факт иметь обьект в невалидном состоянии вообще.


Это просто другой подход. Можно признак невалидности держать отдельно, а можно — встроенно. Второй подход очень распространён из-за его банального удобства. Например, указатель, равный NULL (nullptr, nil и т.д.) В большинстве реализаций внутри NULL — число 0. Это значит, что вы не можете для каких-то сурово системных целей читать/писать память по адресу 0; но вы в таком случае не можете использовать логику, что NULL означает признак невалидности указателя. Или open(), которая выдаёт в int дескриптор файла (если >=0) или признак ошибки (-1), а не отдельный флаг ошибки. Дотнетовский Nullable<T> в этом смысле — удобная контейнеризация отдельного признака невалидности, пригодная ко всему, но удорожанием. В IEEE754 сделали встроенный.

__> мы не можем иметь int имеющий одновременно и плюс и минус. мы не можем иметь букву, которая одновременно и а и б. мы не можем иметь строку ненулевой длины начинающейся с 0.


C-строка, начинающаяся с NUL? Прошу быть корректнее в терминах. А то всяким std::string это никто не запрещает.

__> мы не можем иметь bool, который одновременно true и false. то есть мы все это можем сделать, но все это будут обьекты в невалидном состоянии. и вместо того, чтобы писать код для каждого из таких случаев, нам было бы в сто раз удобнее не допускать такое состояние вообще.


Не вижу никаких причин утверждать про "удобнее", тем более "в сто раз", и вижу противоположные тенденции, как на своём опыте, так и на опыте всей отрасли (выражающемся в создании значений типа NULL и NaN, возврате -1 по ошибке, и т.п.).
И пример с bool некорректен, если вспомнить fuzzy logic (нечёткую логику) и её признаки вероятности какого-то значения.
И "этот int положительный с вероятностью 69% и отрицательный с 26%" тоже возможно, если этого требует модель.

__> возникновение такого состояния — abort()


Повторюсь: включите через feenableexcept() все разрешения исключений и наслаждайтесь abort() по минимальной проблеме. Но текущий стандарт писали люди, у которых было явно больше опыта.
The God is real, unless declared integer.
Re[6]: А идет ли развитие в области альтернатив исключениям?
От: _hum_ Беларусь  
Дата: 26.03.16 11:10
Оценка:
Здравствуйте, netch80, Вы писали:

N>Здравствуйте, _hum_, Вы писали:


__>>>Здравствуйте, _hum_, Вы писали:

__>>>>в этом случае даже если у вас произойдет деление на нуль, поток управления все равно продолжит течь, как ни в чем не бывало
__>>>производя мусор
__>>не мусор, а NaN значение

N>Придерусь — не NaN, а Inf. Это разные значения. В остальном согласен.


ого. не знал, что они ввели еще и бесконечности. здорово. только почему-то не нахожу инфу по их поведению (предполагаею, что наверное полностью соответствующее математическому определению + выход в qNaN в случае математической неопределенности. так?)

__>>>с точки зрения матана бесконечность — процесс

__>>нет. в матане есть два понятия — потенциальная (и это действительно бесконечный процесс) и абсолютная (предел) бесконечности

N>s/абсолютная/актуальная/


да, конечно
Re[4]: А идет ли развитие в области альтернатив исключениям?
От: _hum_ Беларусь  
Дата: 26.03.16 11:57
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, _hum_, Вы писали:


EP>>>Есть некий симбиоз возвращаемых значений и исключений — expected&lt;T&gt;

__>>выглядит страшнова-то.. а вот указанный boost::optional<T> уже "ближе", но все равно еще не то...

EP>От Optional отличие только в том, что внутри могут хранится разные исключения, а не только bad_optional_access.


в boost::optional<T> тоже зашит эксепшн? ну тогда он мне тоже не нравится мне нравится сама идея — возможность самому расширять любой тип значением undefined, чтобы замкнуть хотя бы какие-то операции


__>>>>Или каких-нибудь замыканий (монад?), наподобие добавления к множеству возможных числовых результатов операций значения NaN, которое выводит деление на нуль из области исключительных ситуаций, и тем самым позволяет избавиться от уймы проверок на промежуточных этапах?

EP>>>Исключения это и есть монада, которая позволяет "избавиться от уймы проверок на промежуточных этапах"
__>>мм... может, я неправильно выразился. я имел ввиду подход, когда вместо того, чтобы считать a/0 неопределенностью, просто расширяют тип вещественных чисел за счет введения значения NaN, для которого полагается
__>> a @ NaN -> NaN
__>> NaN @ NaN -> NaN
__>>(здесь @ — любая операция)

EP>Это аппликативный функтор, а не монада.


а я думал, это что-то из разряда хаскелловской монады Maybe

__>>в этом случае даже если у вас произойдет деление на нуль, поток управления все равно продолжит течь, как ни в чем не бывало, предоставляя вам свободу выбора, где делать проверку на валидность соответствующего значения.


EP>Монада в этом контексте как раз и отличается от аппликативного функтора тем что может прервать поток управления, так как весь этот поток управления протекает через неё.


ну, я не спец. но интуиция мне подсказывает, что монады в чистом функциональном языке программирования вводились не для того, чтобы туда протаскивать такие императивные вещи, как исключения. возможно, я ошибаюсь.

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


EP>Вообще-то наоборот — с исключениями мы имеем обычную логику не замусоренную проверками и обработками. Обработка же обычно происходит где-то наверху стэка.


ну как же не замусоренную, если вам придется продумывать "а что будет, если вот именно в этом месте поток исполнения прервется и пойдет по совсем другому пути" и вставлять предусматривающий такой ход код?
кроме того, одна и та же нештатная ситуация может быть критической в одном случае и некритической в другом. и если она может возникнуть, например, в функции f() которую вы используете в нескольких местах, то вам придется во всех местах использования ставить трай-кэтчи, замусоривая код, тогда как в случае с аналогом NaN такой необходимости не будет.

другими словами, ексепшены принуждают программиста под угрозой повалить программу ловить их всюду, тогда как "NaN-подход" просто дает возможность узнать валидность вычисления там, где эта валидность действительно принципиальна для программиста.
Re[2]: А идет ли развитие в области альтернатив исключениям?
От: _hum_ Беларусь  
Дата: 26.03.16 12:02
Оценка:
Здравствуйте, LaptevVV, Вы писали:

__>>В с++ в направлении усовершенствования исключений идет заметное движение. А как вообще в мире и в с++ в частности обстоит дело с развитием альтернатив исключениям (теми же кодами возвратов ошибок)?

LVV>Да дело не в инструменте как таковом.
LVV>Если ты для каждого состояния системы рассмотришь не только рабочие состояния, но и аварийные...
LVV>Если ты рассклассифицируешь эти аварийные состояния по степени тяжести...
LVV>Если ты спроектируешь реакцию системы в каждом классе аварийных состояний...
LVV>Если ты напишешь все сообщения для аварийных состояний...
LVV>Тогда можно посмотреть в сторону инструмента — как это все реализовать.
LVV>ИМХО в этом случае аппарата исключений вполне достаточно.
LVV>А в системах реального времени — коды возврата (если средство разработки для этого подходящее)

нет, дело именно в инструментарии, потому как иногда из-за его отсутствия приходится пересматривать понятие "аварийность" (когда обрабатывать некритические ошибки становится настолько громозко, что проще сделать их критическими с вызовом abort()")
Re[3]: А идет ли развитие в области альтернатив исключениям?
От: LaptevVV Россия  
Дата: 26.03.16 12:29
Оценка:
LVV>>Тогда можно посмотреть в сторону инструмента — как это все реализовать.
LVV>>ИМХО в этом случае аппарата исключений вполне достаточно.
LVV>>А в системах реального времени — коды возврата (если средство разработки для этого подходящее)
__>нет, дело именно в инструментарии, потому как иногда из-за его отсутствия приходится пересматривать понятие "аварийность" (когда обрабатывать некритические ошибки становится настолько громозко, что проще сделать их критическими с вызовом abort()")
А разве в С++ инструмент отсутствует?
Мне, например, исключений хватает за глаза.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[5]: А идет ли развитие в области альтернатив исключениям?
От: Evgeny.Panasyuk Россия  
Дата: 26.03.16 13:01
Оценка: +2
Здравствуйте, _hum_, Вы писали:

EP>>От Optional отличие только в том, что внутри могут хранится разные исключения, а не только bad_optional_access.

__>в boost::optional<T> тоже зашит эксепшн?

Если он пустой, и безусловно доставать из него значение — да, будет исключение.

__>мне нравится сама идея — возможность самому расширять любой тип значением undefined, чтобы замкнуть хотя бы какие-то операции


Мне не нравится инфицирование всех выражений undefined'ом.

__>>>мм... может, я неправильно выразился. я имел ввиду подход, когда вместо того, чтобы считать a/0 неопределенностью, просто расширяют тип вещественных чисел за счет введения значения NaN, для которого полагается

__>>> a @ NaN -> NaN
__>>> NaN @ NaN -> NaN
__>>>(здесь @ — любая операция)
EP>>Это аппликативный функтор, а не монада.
__>а я думал, это что-то из разряда хаскелловской монады Maybe

Каждая монада это аппликативный функтор, но не наоборот. Если использовать именно монадические свойства Maybe, например через Haskell'евский do-синтаксис, то на первом Nothing'е весь поток управления остановится, собственно для этого и происходит заворачивание в do-синтаксис, чтобы был контроль над потоком управления (что особенно видно если вручную расписать замыкания и bind'ы).

Если же речь идёт про лифтование произвольных операций как в твоей табличке выше, то для этого достаточно аппликативного функтора.

__>>>в этом случае даже если у вас произойдет деление на нуль, поток управления все равно продолжит течь, как ни в чем не бывало, предоставляя вам свободу выбора, где делать проверку на валидность соответствующего значения.

EP>>Монада в этом контексте как раз и отличается от аппликативного функтора тем что может прервать поток управления, так как весь этот поток управления протекает через неё.
__>ну, я не спец. но интуиция мне подсказывает, что монады в чистом функциональном языке программирования вводились не для того, чтобы туда протаскивать такие императивные вещи, как исключения. возможно, я ошибаюсь.

Их изначально именно и протаскивали ради императивных вещей, в частности таких как ввод-вывод.
Собственно исключения в Haskell именно как монада и реализованы.

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


EP>>Вообще-то наоборот — с исключениями мы имеем обычную логику не замусоренную проверками и обработками. Обработка же обычно происходит где-то наверху стэка.


__>ну как же не замусоренную, если вам придется продумывать "а что будет, если вот именно в этом месте поток исполнения прервется и пойдет по совсем другому пути" и вставлять предусматривающий такой ход код?


Если речь идёт про Exception safety, то на C++ обычно всё что требуется для basic guarantee было бы и без исключений. Если же речь про strong guarantee, которую часто ассоциируют с транзакционностью — то её придётся "продумывать" в любом языке

__>кроме того, одна и та же нештатная ситуация может быть критической в одном случае и некритической в другом. и если она может возникнуть, например, в функции f() которую вы используете в нескольких местах, то вам придется во всех местах использования ставить трай-кэтчи, замусоривая код,


Почему же во всех местах использования? Только в тех, где это критично.

__>тогда как в случае с аналогом NaN такой необходимости не будет.


Если в каком-то месте критично чтобы вызов f() прошёл нормально, вернув нормальный результат, то и в случае с NaN'ами придётся городить проверки

__>другими словами, ексепшены принуждают программиста под угрозой повалить программу ловить их всюду,


Под какой угрозой? Исключения обычно ловятся в очень малом количестве мест, как раз позволяя убрать мусор присутствующий без них на кодах возвратов.

__>тогда как "NaN-подход" просто дает возможность узнать валидность вычисления там, где эта валидность действительно принципиальна для программиста.


Почему эта мифическая угроза заставляет ловить везде исключения, но при этом не заставляет проверять NaN-ы?
Re[4]: А идет ли развитие в области альтернатив исключениям?
От: _hum_ Беларусь  
Дата: 26.03.16 13:03
Оценка: 13 (1)
Здравствуйте, LaptevVV, Вы писали:

LVV>>>Тогда можно посмотреть в сторону инструмента — как это все реализовать.

LVV>>>ИМХО в этом случае аппарата исключений вполне достаточно.
LVV>>>А в системах реального времени — коды возврата (если средство разработки для этого подходящее)
__>>нет, дело именно в инструментарии, потому как иногда из-за его отсутствия приходится пересматривать понятие "аварийность" (когда обрабатывать некритические ошибки становится настолько громозко, что проще сделать их критическими с вызовом abort()")
LVV>А разве в С++ инструмент отсутствует?
LVV>Мне, например, исключений хватает за глаза.

а вы ссылку Evgeny.Panasyuk на выступление Александреску по этому поводу открывали? Хотя бы просто слайды гляньте: C++ and Beyond 2012: Andrei Alexandrescu &mdash; Systematic Error Handling in C++ &mdash; slides
в частности, слайд 11:

Exceptions are, [...]

• Slow on the exceptional path
• Hopelessly serial
— Only one exception in flight
— Requires immediate, exclusive attention
— Dedicated control flow
• Associated only with root reasons, not goals
— “I/O error” doesn’t describe “saving
weight file”

и вдобавок слайд 12

• Common complaint: “Error codes are limited!
Exceptions are arbitrarily rich!”

Re[6]: А идет ли развитие в области альтернатив исключениям?
От: _hum_ Беларусь  
Дата: 26.03.16 13:32
Оценка: :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, _hum_, Вы писали:


__>>мне нравится сама идея — возможность самому расширять любой тип значением undefined, чтобы замкнуть хотя бы какие-то операции


EP>Мне не нравится инфицирование всех выражений undefined'ом.


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

__>>>>мм... может, я неправильно выразился. я имел ввиду подход, когда вместо того, чтобы считать a/0 неопределенностью, просто расширяют тип вещественных чисел за счет введения значения NaN, для которого полагается

__>>>> a @ NaN -> NaN
__>>>> NaN @ NaN -> NaN
__>>>>(здесь @ — любая операция)
EP>>>Это аппликативный функтор, а не монада.
__>>а я думал, это что-то из разряда хаскелловской монады Maybe

EP>Каждая монада это аппликативный функтор, но не наоборот. Если использовать именно монадические свойства Maybe, например через Haskell'евский do-синтаксис, то на первом Nothing'е весь поток управления остановится, собственно для этого и происходит заворачивание в do-синтаксис, чтобы был контроль над потоком управления (что особенно видно если вручную расписать замыкания и bind'ы).


EP>Если же речь идёт про лифтование произвольных операций как в твоей табличке выше, то для этого достаточно аппликативного функтора.


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

__>>>>в этом случае даже если у вас произойдет деление на нуль, поток управления все равно продолжит течь, как ни в чем не бывало, предоставляя вам свободу выбора, где делать проверку на валидность соответствующего значения.

EP>>>Монада в этом контексте как раз и отличается от аппликативного функтора тем что может прервать поток управления, так как весь этот поток управления протекает через неё.
__>>ну, я не спец. но интуиция мне подсказывает, что монады в чистом функциональном языке программирования вводились не для того, чтобы туда протаскивать такие императивные вещи, как исключения. возможно, я ошибаюсь.

EP>Их изначально именно и протаскивали ради императивных вещей, в частности таких как ввод-вывод.


да, но не так, чтобы повторить императивные вещи, а чтобы смоделировать императивность через функциональность (по крайней мере мне так казалось).

EP>Собственно исключения в Haskell именно как монада и реализованы.


ну так да, монада, которая тоже, наскоько я понял, "распространяет исключение" по обычному пути, а не меняет путь потока выполнения, как в императивном языке.

1.1 Exception monad
[...]
There is an old dispute between C++ programmers on whether exceptions or error return codes are the right way. Also Niklaus Wirth considered exceptions to be the reincarnation of GOTO and thus omitted them in his languages. Haskell solves the problem a diplomatic way: Functions return error codes, but the handling of error codes does not uglify the calling code.


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


EP>>>Вообще-то наоборот — с исключениями мы имеем обычную логику не замусоренную проверками и обработками. Обработка же обычно происходит где-то наверху стэка.


__>>ну как же не замусоренную, если вам придется продумывать "а что будет, если вот именно в этом месте поток исполнения прервется и пойдет по совсем другому пути" и вставлять предусматривающий такой ход код?


EP>Если речь идёт про Exception safety, то на C++ обычно всё что требуется для basic guarantee было бы и без исключений.


ну так речь о том, какие средства появились для поддержки этого

__>>кроме того, одна и та же нештатная ситуация может быть критической в одном случае и некритической в другом. и если она может возникнуть, например, в функции f() которую вы используете в нескольких местах, то вам придется во всех местах использования ставить трай-кэтчи, замусоривая код,


EP>Почему же во всех местах использования? Только в тех, где это критично.


ну, если вы где-то не поставите катч, то программа у вас повалится, даже если в том месте исключение не будет для вас критичным.

__>>тогда как в случае с аналогом NaN такой необходимости не будет.


EP>Если в каком-то месте критично чтобы вызов f() прошёл нормально, вернув нормальный результат, то и в случае с NaN'ами придётся городить проверки


да, но в том месте, где это некритично, проверки можно не ставить

__>>другими словами, ексепшены принуждают программиста под угрозой повалить программу ловить их всюду,


EP>Под какой угрозой? Исключения обычно ловятся в очень малом количестве мест, как раз позволяя убрать мусор присутствующий без них на кодах возвратов.


но вам их обязательно надо ловить! даже там, где вам это некритично.

__>>тогда как "NaN-подход" просто дает возможность узнать валидность вычисления там, где эта валидность действительно принципиальна для программиста.


EP>Почему эта мифическая угроза заставляет ловить везде исключения, но при этом не заставляет проверять NaN-ы?


if(1 == f())
{
   do_something();
}


в случае с "NaN" никаких доп. проверок делать не нужно. в случае с эксепшеном обязательно надо ставить трай-катч
Re[9]: А идет ли развитие в области альтернатив исключениям?
От: __kot2  
Дата: 26.03.16 13:50
Оценка:
Здравствуйте, netch80, Вы писали:
N>Мнэээ... подробнее, пожалуйста. Функция, насколько я помню, это отображение, которое для каждого прообраза из области определения даёт один и только один образ из области значений. Так?
N>И каким же образом это дополнение противоречит определению функции, если для f(x)=1/x
N>1) мы добавляем значения 0 и ∞ в обе области (определения и значения);
N>2) функция переводит их друг в друга;
N>3) значение функции для любого другого значения из ℝ этим не меняется
N>?
речь именно про две бесконечности. не может быть +∞ и -∞. только одна. иначе значение 1/x имеет два значения в нуле

N>А кто говорил про такую же линейную упорядочённость, и что она в этом случае должна сохраняться? Естественно, я не требую её сохранения (в том же виде) в случае включения ∞.

ну то есть устроит отстусвие непрерывности элементарных ф-ий и их дифференцируемости? а зачем вам вообще такие числа?

N>Не вижу никаких причин утверждать про "удобнее", тем более "в сто раз", и вижу противоположные тенденции, как на своём опыте, так и на опыте всей отрасли (выражающемся в создании значений типа NULL и NaN, возврате -1 по ошибке, и т.п.).

я и говорю, школота отокует

N>И пример с bool некорректен, если вспомнить fuzzy logic (нечёткую логику) и её признаки вероятности какого-то значения.

ну то есть устроит, если вдруг стандартный bool начнет возвращать вдруг true или false там с некоторыми раскладами?
Re[7]: А идет ли развитие в области альтернатив исключениям?
От: __kot2  
Дата: 26.03.16 13:54
Оценка:
Здравствуйте, _hum_, Вы писали:
EP>>Почему эта мифическая угроза заставляет ловить везде исключения, но при этом не заставляет проверять NaN-ы?
__>
__>if(1 == f())
__>{
__>   do_something();
__>}
__>

__>в случае с "NaN" никаких доп. проверок делать не нужно. в случае с эксепшеном обязательно надо ставить трай-катч

а в таком случае?

if(f() > 0)
   do_something();
else
   do_something2();


удобно сразу стало, да, иметь Nan ?

если вы допускаете Nan, то, например, даже две корректные реализации поиска максимального элемента массива могут дать разные результаты. вам нужны nan-proof версии всего когда, использующего сравнения < >

то же самое с сортировками

при введении Nan вы либо откалываетесь от всех сравнений <, либо пишете проверку на nan перед каждым таким сравнением. стало сразу удобно, да? только школьник-жапоскриптер может испытывать удобства от наличия Nan, ваяя свой спагетти говнокод
Отредактировано 26.03.2016 14:12 __kot2 . Предыдущая версия .
Re[5]: А идет ли развитие в области альтернатив исключениям?
От: LaptevVV Россия  
Дата: 26.03.16 14:07
Оценка: +1
Спасибо.
Ну, мне, например, понятно, что с развитием параллельного программирования надо с исключениями что-то делать.
Но, например, "медленность" их обработки — это фигня-вопрос.
Когда исключение возникает — тут уже не до скорости, тут авария.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[6]: А идет ли развитие в области альтернатив исключениям?
От: BulatZiganshin  
Дата: 26.03.16 14:25
Оценка: +2
Здравствуйте, LaptevVV, Вы писали:

LVV>Ну, мне, например, понятно, что с развитием параллельного программирования надо с исключениями что-то делать.

LVV>Но, например, "медленность" их обработки — это фигня-вопрос.
LVV>Когда исключение возникает — тут уже не до скорости, тут авария.

представь себе что скажем ты на gpu обрабатываешь триллион точек в секунду. и те точки у которых с данными что-то не срослось — надо просто игнорировать. какие уж там исключения, даже на if'ы времени не хватит...
Люди, я люблю вас! Будьте бдительны!!!
Re[8]: А идет ли развитие в области альтернатив исключениям?
От: BulatZiganshin  
Дата: 26.03.16 14:26
Оценка: -1
Здравствуйте, __kot2, Вы писали:

__>при введении Nan вы либо откалываетесь от всех сравнений <, либо пишете проверку на nan перед каждым таким сравнением. стало сразу удобно, да? только школьник-жапоскриптер может испытывать удобства от наличия Nan, ваяя свой спагетти говнокод


тссс, главное ему не говорите, что у чисел в компе ограниченная точность, а то профессора апоклепсический удар хватит
Люди, я люблю вас! Будьте бдительны!!!
Re[5]: А идет ли развитие в области альтернатив исключениям?
От: BulatZiganshin  
Дата: 26.03.16 14:32
Оценка:
Здравствуйте, _hum_, Вы писали:

__>ну, я не спец. но интуиция мне подсказывает, что монады в чистом функциональном языке программирования вводились не для того, чтобы туда протаскивать такие императивные вещи, как исключения. возможно, я ошибаюсь.


монады — это как раз математическая концепция, позволяющая описывать побочные эффекты. т.е. пишешь ты x+y, а x/y могут быть null или future или вообще списком
Люди, я люблю вас! Будьте бдительны!!!
Re[8]: А идет ли развитие в области альтернатив исключениям?
От: _hum_ Беларусь  
Дата: 26.03.16 14:42
Оценка:
Здравствуйте, __kot2, Вы писали:

__>Здравствуйте, _hum_, Вы писали:

EP>>>Почему эта мифическая угроза заставляет ловить везде исключения, но при этом не заставляет проверять NaN-ы?
__>>
__>>if(1 == f())
__>>{
__>>   do_something();
__>>}
__>>

__>>в случае с "NaN" никаких доп. проверок делать не нужно. в случае с эксепшеном обязательно надо ставить трай-катч

__>а в таком случае?


__>
__>if(f() > 0)
__>   do_something();
__>else
__>   do_something2();

__>


__>удобно сразу стало, да, иметь Nan ?


речь не о самом сыром float-NaN, а об идее. а в ней можно ограничить число операторов, которые могу использоваться со значениями "нан"-расширенного типа.
например, в приведенном коде функция бы имела декларацию extended_t<float> f(); и компилятор обязан был бы выдать ошибку в месте, где выполняется сравнение f() > 0, ибо эта операция не определена для расширенного типа.
Re[6]: А идет ли развитие в области альтернатив исключениям?
От: _hum_ Беларусь  
Дата: 26.03.16 14:48
Оценка:
Здравствуйте, BulatZiganshin, Вы писали:

BZ>Здравствуйте, _hum_, Вы писали:


__>>ну, я не спец. но интуиция мне подсказывает, что монады в чистом функциональном языке программирования вводились не для того, чтобы туда протаскивать такие императивные вещи, как исключения. возможно, я ошибаюсь.


BZ>монады — это как раз математическая концепция, позволяющая описывать побочные эффекты. т.е. пишешь ты x+y, а x/y могут быть null или future или вообще списком


описывать (моделировать), а не повторять.
Re[10]: А идет ли развитие в области альтернатив исключениям?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 26.03.16 15:00
Оценка:
Здравствуйте, __kot2, Вы писали:

__>речь именно про две бесконечности. не может быть +∞ и -∞. только одна. иначе значение 1/x имеет два значения в нуле


Да, одна. В интерпретации числовой окружности — именно так.
В компьютере — нет, потому что там +0 отличается от -0 (что принципиально в небольшом количестве интересных случаев).

N>>А кто говорил про такую же линейную упорядочённость, и что она в этом случае должна сохраняться? Естественно, я не требую её сохранения (в том же виде) в случае включения ∞.

__>ну то есть устроит отстусвие непрерывности элементарных ф-ий и их дифференцируемости?

О. Так речь шла вообще о функциях или о непрерывности и дифференцируемости?

__> а зачем вам вообще такие числа?


Тут уже упоминали ТФКП. Советую повторить.
Мне они такие не нужны, а вот INF компьютерное как отображение ситуации "тут был зашкал порядка" — нужен. И не надо его сводить до актуальной бесконечности, INF покрывает более широкий набор случаев.

__>я и говорю, школота отокует


Как удобно всё, чего не понимаешь, объявить целями школоты.

N>>И пример с bool некорректен, если вспомнить fuzzy logic (нечёткую логику) и её признаки вероятности какого-то значения.

__>ну то есть устроит, если вдруг стандартный bool начнет возвращать вдруг true или false там с некоторыми раскладами?

Стандартный — нет. Он уже ограничен. Но если бы не был ограничен, то вполне можно было бы использовать.
The God is real, unless declared integer.
Re[7]: А идет ли развитие в области альтернатив исключениям?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 26.03.16 15:02
Оценка: 4 (1)
Здравствуйте, _hum_, Вы писали:

N>>Придерусь — не NaN, а Inf. Это разные значения. В остальном согласен.

__>ого. не знал, что они ввели еще и бесконечности. здорово. только почему-то не нахожу инфу по их поведению (предполагаею, что наверное полностью соответствующее математическому определению + выход в qNaN в случае математической неопределенности. так?)

В общем да, но есть тонкости. Можете почитать final draft, он открыто выложен.
The God is real, unless declared integer.
Re: А идет ли развитие в области альтернатив исключениям?
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 26.03.16 15:20
Оценка:
Здравствуйте, _hum_, Вы писали:

__>Нет ли каких-нибудь подходов хотя бы с облегчением передачи и унификацией кодов возвратов, например?


Возможно частично проблему исключений могут решить сопрограммы. В этом случае ошибочное состояние будет храниться как результат в одной из сопрогрограмм, где оно возникло.
Re[7]: А идет ли развитие в области альтернатив исключениям?
От: Evgeny.Panasyuk Россия  
Дата: 26.03.16 17:16
Оценка:
Здравствуйте, _hum_, Вы писали:

__>>>мне нравится сама идея — возможность самому расширять любой тип значением undefined, чтобы замкнуть хотя бы какие-то операции

EP>>Мне не нравится инфицирование всех выражений undefined'ом.
__>почему "всех"? можно же дать программисту возможность выбора, в каких операциях может участвовать расширенный тип, а в каких нет (и на этапе компиляции это отслеживать).

Всех в цепочке вычислений.

EP>>Их изначально именно и протаскивали ради императивных вещей, в частности таких как ввод-вывод.

__>да, но не так, чтобы повторить императивные вещи, а чтобы смоделировать императивность через функциональность (по крайней мере мне так казалось).

Повторять в каком смысле? В плане реализации — нет, там не повторение, а усложнение — нарезание всего кода на трёхэтажные замыкания. А вот по форме, в том числе и в случае с монадой Exceptional — очень и очень близко.

EP>>Собственно исключения в Haskell именно как монада и реализованы.

__>ну так да, монада, которая тоже, наскоько я понял, "распространяет исключение" по обычному пути, а не меняет путь потока выполнения, как в императивном языке.

Именно меняет поток выполнения, прерывая его до первого catch, и именно так как в императивном языке.
И именно для того и нужны монады, чтобы управлять потоком выполнения.

__>>>кроме того, одна и та же нештатная ситуация может быть критической в одном случае и некритической в другом. и если она может возникнуть, например, в функции f() которую вы используете в нескольких местах, то вам придется во всех местах использования ставить трай-кэтчи, замусоривая код,

EP>>Почему же во всех местах использования? Только в тех, где это критично.
__>ну, если вы где-то не поставите катч, то программа у вас повалится,

Что значит "повалится"?

__>даже если в том месте исключение не будет для вас критичным.


Так смысл исключений как раз в том, что их нельзя проигнорировать, и это правильный подход по-умолчанию. Когда же легко игнорировать, например при кодах возврата — то их систематически игнорируют
Автор: MTD
Дата: 21.02.13
.

__>>>тогда как в случае с аналогом NaN такой необходимости не будет.

EP>>Если в каком-то месте критично чтобы вызов f() прошёл нормально, вернув нормальный результат, то и в случае с NaN'ами придётся городить проверки
__>да, но в том месте, где это некритично, проверки можно не ставить

Там где некритично — пусть оно летит наверх по стэку.

__>>>другими словами, ексепшены принуждают программиста под угрозой повалить программу ловить их всюду,

EP>>Под какой угрозой? Исключения обычно ловятся в очень малом количестве мест, как раз позволяя убрать мусор присутствующий без них на кодах возвратов.
__>но вам их обязательно надо ловить!

Не вижу в этом проблемы — поставь catch наверху стэка

__>даже там, где вам это некритично.


Дай определение "некритично".

__>
__>if(1 == f())
__>{
__>   do_something();
__>}
__>

__>в случае с "NaN" никаких доп. проверок делать не нужно. в случае с эксепшеном обязательно надо ставить трай-катч

Обычно нужно обрабатывать все граничные варианты.
И не вижу проблемы с try-catch для случаев явного игнорирования, так как это очень редкий случай.
Я вот вообще не припомню вот такой код:
try{ action1(); } catch(...){ /*ignore*/ }
try{ action2(); } catch(...){ /*ignore*/ }
try{ action3(); } catch(...){ /*ignore*/ }
Re: А идет ли развитие в области альтернатив исключениям?
От: kov_serg Россия  
Дата: 26.03.16 17:21
Оценка:
Здравствуйте, _hum_, Вы писали:

__>В с++ в направлении усовершенствования исключений идет заметное движение. А как вообще в мире и в с++ в частности обстоит дело с развитием альтернатив исключениям (теми же кодами возвратов ошибок)?

__>Нет ли каких-нибудь подходов хотя бы с облегчением передачи и унификацией кодов возвратов, например? Или каких-нибудь замыканий (монад?), наподобие добавления к множеству возможных числовых результатов операций значения NaN, которое выводит деление на нуль из области исключительных ситуаций, и тем самым позволяет избавиться от уймы проверок на промежуточных этапах?

Вот подход, облегчающий жизнь, который позволяет избавиться от уймы проверок
http://reactivex.io/
Re[6]: А идет ли развитие в области альтернатив исключениям?
От: Evgeny.Panasyuk Россия  
Дата: 26.03.16 17:36
Оценка:
Здравствуйте, BulatZiganshin, Вы писали:

BZ>монады — это как раз математическая концепция, позволяющая описывать побочные эффекты. т.е. пишешь ты x+y, а x/y могут быть null или future или вообще списком


Для подобного лифтования операторов монады не нужны, достаточно аппликативного функтора.
Монады нужны именно для описания последовательности действий и контроля над потоком выполнения.
Re[2]: А идет ли развитие в области альтернатив исключениям?
От: uncommon Ниоткуда  
Дата: 27.03.16 05:01
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Есть некий симбиоз возвращаемых значений и исключений — expected&lt;T&gt;


Товарищ Александреску опять по своему обыкновению придумал фигню, которую никто никогда не будет использовать. Даже он сам. Expected<T> завязан на make_exception_ptr:

// Building from exception
// © 2012- Andrei Alexandrescu. Do not redistribute. 23 / 54
template
<class E>
static Expected<T> fromException(const E& exception) {
  if (typeid(exception) != typeid(E)) {
    throw std::invalid_argument( "slicing detected");
  }
  return fromException(std::make_exception_ptr(exception));
}


А make_exception_ptr как реализован?

166│   /// Obtain an exception_ptr pointing to a copy of the supplied object.
167│   template<typename _Ex>
168│     exception_ptr
169│     make_exception_ptr(_Ex __ex) _GLIBCXX_USE_NOEXCEPT
170│     {
171│ #if __cpp_exceptions
172│       try
173│         {
174├>          throw __ex;
175│         }
176│       catch(...)
177│         {
178│           return current_exception();
179│         }
180│ #else
181│       return exception_ptr();
182│ #endif
183│     }


То бишь, проще и более эффективно просто сразу выбросить исключение и не заморачиваться с Expected<T>, который внутри себя бросает, а потом ловит исключение, с одной единственной целью, как он сам говорит: избежать выброса исключения, потому что это очень дорогая операция.
Отредактировано 27.03.2016 5:03 uncommon . Предыдущая версия .
Re[3]: А идет ли развитие в области альтернатив исключениям?
От: -MyXa- Россия  
Дата: 27.03.16 05:50
Оценка: -1
Здравствуйте, uncommon, Вы писали:

U>Товарищ Александреску опять по своему обыкновению придумал фигню, которую никто никогда не будет использовать. Даже он сам. Expected<T> завязан на make_exception_ptr:


Смотри что покажу — std::make_exception_ptr.

Там сказано "as if", но на самом деле исключение не выбрасывается из экономии.
Если не поможет, будем действовать током... 600 Вольт (C)
Re[8]: А идет ли развитие в области альтернатив исключениям?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 27.03.16 07:13
Оценка:
Здравствуйте, __kot2, Вы писали:

__>если вы допускаете Nan, то, например, даже две корректные реализации поиска максимального элемента массива могут дать разные результаты. вам нужны nan-proof версии всего когда, использующего сравнения < >

__>то же самое с сортировками

Глубокоуважаемый коллега забывает, что сравнение вещественных чисел на больше-меньше, кроме самого низкого уровня реализации, вообще является операцией очень сомнительной по смыслу. Если эти числа возникли из вычислений, то в большинстве случаев сравнение должно включать в себя оценку на абсолютную и относительную погрешность, и числа могут быть достаточно близки, чтобы для них "больше" или "меньше" стало недостаточно обооснованными. Если это что-то вроде входных данных статистики, то там или это уже решено (scipy, например, отрабатывает это из коробки), или NaN'ов просто не будет.

Если же вдруг кому-то такие безобразия (сравнение несравнимого) потребовались, то стандарт IEEE754 определяет понятие total ordering и соответствующие функции сравнения для таких случаев. В качестве "заката солнца вручную" при отсутствии таких средств в библиотеках можно постановить, что любой NaN больше определённого значения и равен другому NaN. Три строчки с перекуром.

__>при введении Nan вы либо откалываетесь от всех сравнений <, либо пишете проверку на nan перед каждым таким сравнением. стало сразу удобно, да? только школьник-жапоскриптер может испытывать удобства от наличия Nan, ваяя свой спагетти говнокод


Только школьник-жабоскриптер может думать, что сортировка вещественных без уточнения (см. выше) имеет какой-то смысл, и да, у него на выходе будет исключительно спагетти говнокод. Нормальные же программисты как минимум вначале вдумчиво прочтут карманную камасутру, а если они хоть квадратное уравнение решают, то FMM должен быть прокурен от корки до корки. Вам, как математику, всё это уже должно было быть известно из вузовского курса и намертво въесться в память.
The God is real, unless declared integer.
Re[3]: А идет ли развитие в области альтернатив исключениям?
От: Erop Россия  
Дата: 27.03.16 22:34
Оценка:
Здравствуйте, _hum_, Вы писали:

__>нет, дело именно в инструментарии, потому как иногда из-за его отсутствия приходится пересматривать понятие "аварийность" (когда обрабатывать некритические ошибки становится настолько громозко, что проще сделать их критическими с вызовом abort()")


А что такое "некритические ошибки" в твоём понимании? И что такое "ошибки" вообще?
Вот я, например, встречал такое определение "исключительной ситуации", что это такая ситуация, которая не должна возникать при выполнении программ, и не позволяет продолжать выполнение.
Тут исключения более или менее в тему, вроде.

Но дальше можно разные ситуации рассматривать как "ошибки", как-то их классифицировать, например на "критические" и нет, и дальше проектировать какие-то реакции н ситуацию.

Вот в известном мне определении есть такой момент, что такая ситуация не должна возникать при выполнении программы. То есть что-то, не известно что, уже пошло не так. Так что ошибка уже не "некритическая"...
Но можно расширить, например так, что иногда мы знаем, что пошло не так, и можем откатить ситуацию и предложить пользователю совет, как обойти проблему. Нужны ли тогда исключения? Ну фиг его знает, можно спроектировать систему обработки таких ситуаций на исключениях, а можно и на чём-то другом. И там и так можно...

Но нужны какие-то конкретные версии политик обработки ошибок и самих определений, что мы считаем ошибкой...
Иначе обсуждать как-то нечего.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: А идет ли развитие в области альтернатив исключениям?
От: Erop Россия  
Дата: 27.03.16 22:51
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

__>>ну как же не замусоренную, если вам придется продумывать "а что будет, если вот именно в этом месте поток исполнения прервется и пойдет по совсем другому пути" и вставлять предусматривающий такой ход код?


EP>Если речь идёт про Exception safety, то на C++ обычно всё что требуется для basic guarantee было бы и без исключений.

IMHO, это не правда...
Ну, например, если мы отдаём куда-то два владеющих указателя, то могли бы написать так:
takeOwnership( new A1, new A2 );

Но из-за basic guarantee не пишем... Пишем что-то более хитрое...
Кстати, если таки считать, что исключение кидают что бы аккуратно перезапустить программу, то память можно терять...

EP>Если же речь про strong guarantee, которую часто ассоциируют с транзакционностью — то её придётся "продумывать" в любом языке

Про strong guarantee разговаривать вообще бессмысленно, IMHO, так как это свойство кода неверефицируемо.
Если нужны гарантии устойчивости такого уровня, то надо как-то совсем иначе проектировать программу

EP>Почему эта мифическая угроза заставляет ловить везде исключения, но при этом не заставляет проверять NaN-ы?

+100500

На самом деле, пока речь о чистых функциях, без сайд-эффектов, то можно и на нанах делать, только дорого исключительные операции обрабатываться будут. Ну да можно же через исключение реализовать, а программисту не говорить
А вот если там какие-то сайд-эффекты есть, в файлы что-то пишут, или там машина на тормоза жмёт/не жмёт, то подход с нанами стрёмный...
Так что в чём будет выгода, хотя бы формально, не ясно...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[7]: А идет ли развитие в области альтернатив исключениям?
От: Erop Россия  
Дата: 27.03.16 23:01
Оценка:
Здравствуйте, BulatZiganshin, Вы писали:


BZ>представь себе что скажем ты на gpu обрабатываешь триллион точек в секунду. и те точки у которых с данными что-то не срослось — надо просто игнорировать. какие уж там исключения, даже на if'ы времени не хватит...


А ядра для какого GPU можно на с++ с исключениями писать?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[9]: А идет ли развитие в области альтернатив исключениям?
От: Erop Россия  
Дата: 27.03.16 23:15
Оценка:
Здравствуйте, netch80, Вы писали:

__>>то же самое с сортировками


N>Глубокоуважаемый коллега забывает, что сравнение вещественных чисел на больше-меньше, кроме самого низкого уровня реализации, вообще является операцией очень сомнительной по смыслу.


А если мне, например, надо отсортировать объекты по вычислимому вещественному параметру?
Скажем я программирую А*, и оценка остатка пути вещественная, то я могу варианты продолжения сортировать?

N>Только школьник-жабоскриптер может думать, что сортировка вещественных без уточнения (см. выше) имеет какой-то смысл, и да, у него на выходе будет исключительно спагетти говнокод.


Можно показать это на примере А* выше?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[10]: А идет ли развитие в области альтернатив исключениям?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 28.03.16 05:46
Оценка:
Здравствуйте, Erop, Вы писали:

__>>>то же самое с сортировками


N>>Глубокоуважаемый коллега забывает, что сравнение вещественных чисел на больше-меньше, кроме самого низкого уровня реализации, вообще является операцией очень сомнительной по смыслу.

E>А если мне, например, надо отсортировать объекты по вычислимому вещественному параметру?
E>Скажем я программирую А*, и оценка остатка пути вещественная, то я могу варианты продолжения сортировать?

Да, если ты уверен, что на входе алгоритма A* не будет NaN'ов, и потому что в таком случае его операции сложения не могут дать такое значение (у тебя же нет отрицательных весов путей? Тогда операция типа +∞ + -∞ невозможна). Также ты тогда знаешь, что погрешности вычисления тебе несущественны (если один путь даст 17.234987498237, а другой 17.234987498238, то тебе нет причин для строго предпочтения второго). Но это ты всё знаешь по сути своих действий, и потому знаешь, что обычная сортировка с обычными сравнениями в таком случае допустима — как с точки зрения погрешностей, так и с точки зрения сравнимости значений.
Не все алгоритмы такие, и для каждого надо стараться явно доказать эту допустимость.

N>>Только школьник-жабоскриптер может думать, что сортировка вещественных без уточнения (см. выше) имеет какой-то смысл, и да, у него на выходе будет исключительно спагетти говнокод.

E>Можно показать это на примере А* выше?

Уже показал.
The God is real, unless declared integer.
Re[11]: А идет ли развитие в области альтернатив исключениям?
От: Erop Россия  
Дата: 28.03.16 07:48
Оценка:
Здравствуйте, netch80, Вы писали:

N>Да, если ты уверен, что на входе алгоритма A* не будет NaN'ов, и потому что в таком случае его операции сложения не могут дать такое значение

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

N>Не все алгоритмы такие, и для каждого надо стараться явно доказать эту допустимость.

Ну я примерно про то же. И для сложной программы анализ того, где там что наны обобщённые наделают сколь угодно сложен...

N>>>Только школьник-жабоскриптер может думать, что сортировка вещественных без уточнения (см. выше) имеет какой-то смысл, и да, у него на выходе будет исключительно спагетти говнокод.

E>>Можно показать это на примере А* выше?

N>Уже показал.

Ты сказал, что "можешь если нанов не будет", а что будет, если эвристика в каком-то случае провалится, не показал...
Ну и сортировка вещественных -- довольно распространённая операция. Или, например, взятие медианы...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[12]: А идет ли развитие в области альтернатив исключениям?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 28.03.16 09:01
Оценка:
Здравствуйте, Erop, Вы писали:

N>>Да, если ты уверен, что на входе алгоритма A* не будет NaN'ов, и потому что в таком случае его операции сложения не могут дать такое значение

E>А если эвристика где-то провалится?..

"Будут два тоннеля" (c)
Или включай исключения, или будь готов, что эвристика провалится, или гарантируй, что не провалится. Кстати, почему сразу "эвристика", почему ты для данного алгоритма не подразумеваешь возможность гарантированного отсутствия NaN?

E>Мы же рассматриваем наны, как альтернативу исключениям?


Да, именно так и рассматриваем.

N>>Не все алгоритмы такие, и для каждого надо стараться явно доказать эту допустимость.

E>Ну я примерно про то же. И для сложной программы анализ того, где там что наны обобщённые наделают сколь угодно сложен...

Включай исключения. Или проверяй по завершению процесса флаги в fegetexcept().

N>>Уже показал.

E>Ты сказал, что "можешь если нанов не будет", а что будет, если эвристика в каком-то случае провалится, не показал...

Зависит от настроек и от алгоритмов. std::sort, например, у меня в случае нарушения предиката на сравнение зависал. А мог и abort() вызвать. Так что вдумчивое применение настроек из <fenv.h> — наше всё.

E>Ну и сортировка вещественных -- довольно распространённая операция. Или, например, взятие медианы...


Я про статистику уже сказал раньше, не вижу смысла повторяться.
The God is real, unless declared integer.
Re[13]: А идет ли развитие в области альтернатив исключениям?
От: Erop Россия  
Дата: 28.03.16 10:59
Оценка:
Здравствуйте, netch80, Вы писали:

N>"Будут два тоннеля" (c)

N>Или включай исключения, или будь готов, что эвристика провалится, или гарантируй, что не провалится. Кстати, почему сразу "эвристика", почему ты для данного алгоритма не подразумеваешь возможность гарантированного отсутствия NaN?

Потому, что А* (я думал это общеизвестная классика, вроде алгоритма Дейкстры, если это не так, то я прошу прощения) — это поиск кратчайшего пути в графе, но более целенаправленный, чем алгоритм Дейкстры. В качестве оценки перспективности того или иного наравления перебора гипотез используется эвристическая оценка цены остатка пути. Например, евклидово расстояния по плоскости. Вот функцию вычисления этой оценки я и называю эвристикой...

N>Включай исключения. Или проверяй по завершению процесса флаги в fegetexcept().

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

N>Зависит от настроек и от алгоритмов. std::sort, например, у меня в случае нарушения предиката на сравнение зависал. А мог и abort() вызвать. Так что вдумчивое применение настроек из <fenv.h> — наше всё.

Так я про то и говорю, что исключения концептуально проще...

N>Я про статистику уже сказал раньше, не вижу смысла повторяться.

Статистика это не все вещественные. Вот А* чем тебе не жизненный пример?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[14]: А идет ли развитие в области альтернатив исключениям?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 28.03.16 15:48
Оценка: +1 :)
Здравствуйте, Erop, Вы писали:

N>>"Будут два тоннеля" (c)

N>>Или включай исключения, или будь готов, что эвристика провалится, или гарантируй, что не провалится. Кстати, почему сразу "эвристика", почему ты для данного алгоритма не подразумеваешь возможность гарантированного отсутствия NaN?

E>Потому, что А* (я думал это общеизвестная классика, вроде алгоритма Дейкстры, если это не так, то я прошу прощения) — это поиск кратчайшего пути в графе, но более целенаправленный, чем алгоритм Дейкстры. В качестве оценки перспективности того или иного наравления перебора гипотез используется эвристическая оценка цены остатка пути. Например, евклидово расстояния по плоскости. Вот функцию вычисления этой оценки я и называю эвристикой...


Про A* я в общем помню, но я подумал, что эвристикой было названо предположение, что NaNов не будет.

N>>Включай исключения. Или проверяй по завершению процесса флаги в fegetexcept().

E>Ну так о том и речь, что почти любой сложный алгоритм с нанами плохо совместим, он тупо может вовсе не сойтись никогда, как вариант, если предусловия из-за нанаов не соблюдаются... Так что fegetexcept можно никогда не проверить

Любая реальная реализация должна иметь ограничение количества итераций. Ну а проблемы качественной реализации математики даже в объёме FMM уже показывают, что это нетривиально и требует умелого проектирования.

N>>Зависит от настроек и от алгоритмов. std::sort, например, у меня в случае нарушения предиката на сравнение зависал. А мог и abort() вызвать. Так что вдумчивое применение настроек из <fenv.h> — наше всё.

E>Так я про то и говорю, что исключения концептуально проще...

Так я и предлагаю оппонентам включать их сразу.

N>>Я про статистику уже сказал раньше, не вижу смысла повторяться.

E>Статистика это не все вещественные. Вот А* чем тебе не жизненный пример?

Я не говорю, что он не жизненный. (Наверняка у меня в навигаторе какая-то его разновидность.)
The God is real, unless declared integer.
Re[8]: А идет ли развитие в области альтернатив исключениям?
От: _hum_ Беларусь  
Дата: 29.03.16 13:25
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, _hum_, Вы писали:


__>>>>мне нравится сама идея — возможность самому расширять любой тип значением undefined, чтобы замкнуть хотя бы какие-то операции

EP>>>Мне не нравится инфицирование всех выражений undefined'ом.
__>>почему "всех"? можно же дать программисту возможность выбора, в каких операциях может участвовать расширенный тип, а в каких нет (и на этапе компиляции это отслеживать).

EP>Всех в цепочке вычислений.


выбранной программистом. например, если речь об ошибках арифметических вычислений, то сделать он это может за счет конвертации на входе нужной ему цепочки значения к типу extended<int> и договоренности, что компилятор контролирует операций, в которых extended<int>::undefined_val никоим образом не должно участвовать (например, в операциях <, >)

грубо говоря, это может выглядеть так

<блок вычислений без контроля ошибок>

//--- начало контролируемой цепочки
extended<float> a_ex = <входные данные в контролируемую цепочку>

<цепочка вычислений, в том числе вида if(1 == a_ex){<bla-bla>}; поскольку сравнение с неопределенным значением - валидная и допускаемая компилятором  операция >

//-- завершение контролируемой цепочки
if(extended<float>::id_proper_value(a_ex))
{
    if(a_ex < 10){<do...>};
}
else
{
   cout<<"invalid result";
};



__>>>>кроме того, одна и та же нештатная ситуация может быть критической в одном случае и некритической в другом. и если она может возникнуть, например, в функции f() которую вы используете в нескольких местах, то вам придется во всех местах использования ставить трай-кэтчи, замусоривая код,

EP>>>Почему же во всех местах использования? Только в тех, где это критично.
__>>ну, если вы где-то не поставите катч, то программа у вас повалится,

EP>Что значит "повалится"?


значит аварийно завершить работу.

__>>даже если в том месте исключение не будет для вас критичным.


EP>Так смысл исключений как раз в том, что их нельзя проигнорировать, и это правильный подход по-умолчанию.


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

EP>Когда же легко игнорировать, например при кодах возврата — то их систематически игнорируют
Автор: MTD
Дата: 21.02.13
.


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

__>>>>тогда как в случае с аналогом NaN такой необходимости не будет.

EP>>>Если в каком-то месте критично чтобы вызов f() прошёл нормально, вернув нормальный результат, то и в случае с NaN'ами придётся городить проверки
__>>да, но в том месте, где это некритично, проверки можно не ставить

EP>Там где некритично — пусть оно летит наверх по стэку.


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

__>>>>другими словами, ексепшены принуждают программиста под угрозой повалить программу ловить их всюду,

EP>>>Под какой угрозой? Исключения обычно ловятся в очень малом количестве мест, как раз позволяя убрать мусор присутствующий без них на кодах возвратов.
__>>но вам их обязательно надо ловить!

EP>Не вижу в этом проблемы — поставь catch наверху стэка


врде, мы ж с этого и начали — я вам говорил, что даже там, где мне не нужны эти проверки, мне придется замусоривать код ими, а вы отвечали

EP>Вообще-то наоборот — с исключениями мы имеем обычную логику не замусоренную проверками и обработками.


__>>даже там, где вам это некритично.


EP>Дай определение "некритично".


от противного — критично — это то, что при продолжении потока исполнения сможет привести к неприемлемым для решаемой задачи результатам (неприемлемость для каждого конкректного случая определяется отдельно конечным пользователем).

__>>
__>>if(1 == f())
__>>{
__>>   do_something();
__>>}
__>>

__>>в случае с "NaN" никаких доп. проверок делать не нужно. в случае с эксепшеном обязательно надо ставить трай-катч

EP>Обычно нужно обрабатывать все граничные варианты.


не факт

EP>И не вижу проблемы с try-catch для случаев явного игнорирования, так как это очень редкий случай.


проблема все та же — загрязнение "найтивного" кода этими трай-кэтч-ужасами.

EP>Я вот вообще не припомню вот такой код:

EP>
EP>try{ action1(); } catch(...){ /*ignore*/ }
EP>try{ action2(); } catch(...){ /*ignore*/ }
EP>try{ action3(); } catch(...){ /*ignore*/ }
EP>


не совсем понял, в чем смысл данного кода


p.s. на всякий случай, я не говорю, что вариант с распространением "загрязнения NaN-ами" потока идеален. я лишь обсуждаю его достоинства перед эксепшенами. а вообще, хотелось бы услышать, что делается, чтобы облегчить (или заменить) технологию с кодами возвратов.
Re[4]: А идет ли развитие в области альтернатив исключениям?
От: _hum_ Беларусь  
Дата: 29.03.16 13:45
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, _hum_, Вы писали:


__>>нет, дело именно в инструментарии, потому как иногда из-за его отсутствия приходится пересматривать понятие "аварийность" (когда обрабатывать некритические ошибки становится настолько громозко, что проще сделать их критическими с вызовом abort()")


E>А что такое "некритические ошибки" в твоём понимании? И что такое "ошибки" вообще?


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

от противного — критично — это то, что при продолжении потока исполнения сможет привести к неприемлемым для решаемой задачи результатам (неприемлемость для каждого конкректного случая определяется отдельно конечным пользователем).


E>Вот я, например, встречал такое определение "исключительной ситуации", что это такая ситуация, которая не должна возникать при выполнении программ, и не позволяет продолжать выполнение.

E>Тут исключения более или менее в тему, вроде.

для этого достаточно было бы просто возможности переопределения встроенной функции обработчика исключения — безо всяких трай-кэтчей.

E>Но дальше можно разные ситуации рассматривать как "ошибки", как-то их классифицировать, например на "критические" и нет, и дальше проектировать какие-то реакции н ситуацию.


E>Вот в известном мне определении есть такой момент, что такая ситуация не должна возникать при выполнении программы. То есть что-то, не известно что, уже пошло не так. Так что ошибка уже не "некритическая"...

E>Но можно расширить, например так, что иногда мы знаем, что пошло не так, и можем откатить ситуацию и предложить пользователю совет, как обойти проблему. Нужны ли тогда исключения? Ну фиг его знает, можно спроектировать систему обработки таких ситуаций на исключениях, а можно и на чём-то другом. И там и так можно...

E>Но нужны какие-то конкретные версии политик обработки ошибок и самих определений, что мы считаем ошибкой...

E>Иначе обсуждать как-то нечего.

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