powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Обработка исключений отсутствует
97 сообщений из 97, показаны все 4 страниц
Обработка исключений отсутствует
    #38390438
stuffy.reg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Считается ли дурным тоном в создаваемом проекте не обрабатывать исключения ?

Недавно довелось ознакомиться с процессом разработки одной команды. Делали клиентскую часть, 4 человека, пол года работы. Тим лид строго запретил обрабатывать исключения...
Одному мне это кажется неправильным, или подобное часто практикуется?
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38390451
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stuffy.regСчитается ли дурным тоном в создаваемом проекте не обрабатывать исключения ?

Недавно довелось ознакомиться с процессом разработки одной команды. Делали клиентскую часть, 4 человека, пол года работы. Тим лид строго запретил обрабатывать исключения...
Одному мне это кажется неправильным, или подобное часто практикуется?

Скорее всего ты либо не правильно понял тимлида, либо речь шла об ограничении тех видов исключений, обработка которых зашита в глобальном обработчике исключений и осуществляется централизованно. Сам посуди. Если ты в своем коде перехватил исключение и обработал его нестандартным образом, выведя его на экран с помощью MessageBox, тогда как все остальные ошибки у вас выводятся специальным диалогом с возможностью отправки ошибок в службу поддержи, ясно, что это никогда не будет одобрено тимлидом.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38390535
Анатолий Широковstuffy.regСчитается ли дурным тоном в создаваемом проекте не обрабатывать исключения ?

Недавно довелось ознакомиться с процессом разработки одной команды. Делали клиентскую часть, 4 человека, пол года работы. Тим лид строго запретил обрабатывать исключения...
Одному мне это кажется неправильным, или подобное часто практикуется?

Скорее всего ты либо не правильно понял тимлида, либо речь шла об ограничении тех видов исключений, обработка которых зашита в глобальном обработчике исключений и осуществляется централизованно. Сам посуди. Если ты в своем коде перехватил исключение и обработал его нестандартным образом, выведя его на экран с помощью MessageBox, тогда как все остальные ошибки у вас выводятся специальным диалогом с возможностью отправки ошибок в службу поддержи, ясно, что это никогда не будет одобрено тимлидом.
Глобальном обработчике это до самого верху стек раскручивают, а как узнают о конкретном месте возникновения исключения?
Не лучше ли самому поймать исключение, вывести на экран, и сделать rethrow с добавлением к строке информации о месте возникновения исключения, или использовать для этого std::throw_with_nested(std::logic_error(std::string(__FILE__) + std::to_string(__LINE__) + __FUNCTION__)); ?
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38390548
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Считается ли дурным тоном в создаваемом проекте не обрабатывать исключения ?

Нет, в общем случае. Вообще, в с++ исключения можно вообще не использовать.

Недавно довелось ознакомиться с процессом разработки одной команды. Делали клиентскую часть, 4 человека, пол года работы. Тим лид строго запретил обрабатывать исключения...
Одному мне это кажется неправильным, или подобное часто практикуется?


Не часто, но бывает.
В современном с++ безусловно выглядит странно.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38390554
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stuffy.regОдному мне это кажется неправильным, или подобное часто практикуется?
Сама по себе задача обработки исключения порождает еще целый
ворох проблем. А именно - как обработать? Игнорировать? Логгировать?
Обернуть в другой тип исключения и передать наверх? e.t.c.
Поэтому иногда лучше ничего не сделать чем "замылить" ошибку,
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38390578
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С исключениями главное - единый подход во всем приложении, иначе будет несопровождаемое месиво.

А вообще это конечно скорее религиозный вопрос, чем технический.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38390579
maytonstuffy.regОдному мне это кажется неправильным, или подобное часто практикуется?
Сама по себе задача обработки исключения порождает еще целый
ворох проблем. А именно - как обработать? Игнорировать? Логгировать?
Обернуть в другой тип исключения и передать наверх? e.t.c.
Поэтому иногда лучше ничего не сделать чем "замылить" ошибку,
Вообще ничего не делать, даже не выводить и не логировать сообщение исключения, и не реализовывать std::unexpected_handler() ?
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38390582
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне трудно понять что имел в виду тот ПМ. Но я вижу его месседж в том
чтобы молясь богу не разбить себе голову. Хватает кодов возврата,
errno, GetLastError e.t.c. для решения задачи ? Хватает ? - Пользуйтесь. Для языков и систем
разработки где НЕЛЬЗЯ по другому получить состояние ошибки - использовать
обязательную обработку.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38390583
stuffy.reg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий Широков, уточнил еще раз. В коде нет связок try-catch. На сервер информация об ошибках не отправляется.
Это клиентская часть он-лайн игры.
Предусмотренно стандартное окно сообщения об ошибке. Используется при парсинге протокола: проверяется наличие некоторых ключей json-a. Причем не всех. Если не нашли то что проверяли - сообщение об ошибке и рестарт игры. Если не нашли и проверки на существование ключа не было - все просто падает.
В игровой механике так же в случае любой ошибки все падает.

Это был мой первый опыт с гемдевом. Может это специфика индустрии и у них часто так принято?
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38390584
stuffy.reg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyС исключениями главное - единый подход во всем приложении, иначе будет несопровождаемое месиво.

А вообще это конечно скорее религиозный вопрос, чем технический.

Да, знаю из бесед, что этого тим лида год назад не взяли в яндекс, проблемы на интервью были как раз с вопросами про обработку исключений.
(* это не сарказм, просто совпадение, я слышал от него самого, что была куча вопросов на эту тему)
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38390613
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stuffy.reg
Это был мой первый опыт с гемдевом. Может это специфика индустрии и у них часто так принято?

Точно нет.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38391033
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivstuffy.regЭто был мой первый опыт с гемдевом. Может это специфика индустрии и у них часто так принято?

Точно нет.
Ну я бы так не говорит однозначно.
Во всех игрушках что я играл, периодически происходил вылет на самом интересном месте.
Отсюда вывод - скорее у них принято как раз обратное - не ловить исключения :)
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38391089
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть еще вариант что по некоторым соображенииям экономят ресурсы.
Ну типа... исключения которые валят в цикле - это нагрузка на вычислительную систему.
Проще проверить return code. Как-то так.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38391103
maytonЕсть еще вариант что по некоторым соображенииям экономят ресурсы.
Ну типа... исключения которые валят в цикле - это нагрузка на вычислительную систему.
Проще проверить return code. Как-то так.
Ну это у них уже исключение головного мозга :)
Как раз таки основное преимущество исключений над кодом возврата, что код возврата всегда должен проверяться на каждой итерации, а исключение можно ловить один раз на весь цикл:
http://forums.pcsx2.net/Thread-blog-C-exceptions-can-be-an-optimization
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38391234
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное есть разные механизмы генерации исключений.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38391272
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обработка исключений вообще и спецификации исключений, в частности, добавляют накладные расходы времени исполнения, даже если никакие исключения не возникают.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38391399
Basil A. SidorovОбработка исключений вообще и спецификации исключений, в частности, добавляют накладные расходы времени исполнения, даже если никакие исключения не возникают.
Получение кода возврата, его проверка и условный переход в сумме добавляют больше накладных расходов - пример по ссылке выше.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38391416
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможность написать:
Код: sql
1.
2.
3.
4.
5.
while (true) {
...
  if (!someThing()) break;
...
}

не зависит от (не)желания использовать исключения.

P.S. И давно try/catch стал дешевле if-а?
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38391451
Basil A. SidorovВозможность написать:
Код: sql
1.
2.
3.
4.
5.
while (true) {
...
  if (!someThing()) break;
...
}

не зависит от (не)желания использовать исключения.

P.S. И давно try/catch стал дешевле if-а?
Да, сейчас сам проверил чего там пишут по ссылке, в общем случае в 2(MSVC)-4(GCC) раза медленней исключения чем код возврата, по крайней мере на таких простых примерах.
http://ideone.com/rx4qqF
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38391492
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovОбработка исключений вообще и спецификации исключений, в частности, добавляют накладные расходы времени исполнения, даже если никакие исключения не возникают.


Обработка кодов возвратов также добавляет накладные расходы времени выполнения, даже если ошибок не возникает.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38391507
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivBasil A. SidorovОбработка исключений вообще и спецификации исключений, в частности, добавляют накладные расходы времени исполнения, даже если никакие исключения не возникают.
Обработка кодов возвратов также добавляет накладные расходы времени выполнения, даже если ошибок не возникает.

Я бы даже сказал больше. Если взять С++ и специально не извращаться (через throw() у каждой функции), то при использовании кодов возврата компилятор сгенерит и код для поддержки исключений (вдобавок к юзерской обработке кодов возврата). Т.е. для случая "даже если никакие исключения не возникают" коды будут медленнее.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38391654
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
Anatoly Moskovsky, а если так?
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38391655
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38391798
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyMasterZivпропущено...

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

Я бы даже сказал больше. Если взять С++ и специально не извращаться (через throw() у каждой функции), то при использовании кодов возврата компилятор сгенерит и код для поддержки исключений (вдобавок к юзерской обработке кодов возврата). Т.е. для случая "даже если никакие исключения не возникают" коды будут медленнее.

Анатолий, полностью отключить исключения — это один флаг компилятора. Кто не любит исключения, кончено, хорошо про этот флаг знают.

Единственно, я совсем не понимаю, как в этом случае будет работать STD, хотя его конечно можно и вообще не использовать...
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38391808
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
? http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Exceptions

Я думаю, в такой конторе здоровой как гуголь, существует не один стандарт кодирования. То, что для каких-то проектов исключения могут не подходить, я вполне согласен. Тем не менее, то, что исключения — генеральная линия развития С++ - несомненно.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38391816
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
? http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Exceptions

Кстати, доводы против исключений все абсолютно дурацкие, все в стиле " как бы чего не вышло ", в современных условиях современный с++ программист и так обязан учитывать все то, что у них записано в Cons.
Код тестировать все равно надо, так что что с исключениями, что без, одинаково.
В общем, кто-то очень хотел запретить исключения, и запретил. По всем бюрократическим правилам, демократично решил.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38392026
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
MasterZivКстати, доводы против исключений все абсолютно дурацкие, все в стиле " как бы чего не вышло ", в современных условиях современный с++ программист и так обязан учитывать все то, что у них записано в Cons.
Код тестировать все равно надо, так что что с исключениями, что без, одинаково.
В общем, кто-то очень хотел запретить исключения, и запретил. По всем бюрократическим правилам, демократично решил.Ну да, с++ программист обязан учитывать, что любая функция может выкинуть абсолютно любое исключение, которое непонятно как обрабатывать.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38392030
?MasterZivКстати, доводы против исключений все абсолютно дурацкие, все в стиле " как бы чего не вышло ", в современных условиях современный с++ программист и так обязан учитывать все то, что у них записано в Cons.
Код тестировать все равно надо, так что что с исключениями, что без, одинаково.
В общем, кто-то очень хотел запретить исключения, и запретил. По всем бюрократическим правилам, демократично решил.Ну да, с++ программист обязан учитывать, что любая функция может выкинуть абсолютно любое исключение, которое непонятно как обрабатывать.
А с-программист обязан учитывать, что любая функция может выкинуть абсолютно любой код возврата, который непонятно как обрабатывать
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38392049
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А бывают еще и Unhandled C++ Exceptions ..
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38392083
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про отключенные исключения.
Я понимаю что их можно отключить.
Но это сразу отключает многие фичи буста и стл, и многих других библиотек, без которых ни один крупный проект не обходится.

Так что помечтать можно, а потом надо спуститься на землю и признать что отключать исключения никто не будет, также как и писать throw() на каждую функцию.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38392184
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА бывают еще и Unhandled C++ Exceptions ..

В Win32/64 бывают и Unhandled non-C++ exceptions...
В Linux/Unix бывают сигналы ...

и что?
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38392191
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
?Ну да, с++ программист обязан учитывать, что любая функция может выкинуть абсолютно любое исключение, которое непонятно как обрабатывать.

Именно.

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

Ты должен быть готов к любым исключениям, но если ты не знаешь, что это за исключение будет или не знаешь, что с ним делать -- просто ничего не делай. Но локальные ресурсы надо защитить.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38392198
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyПро отключенные исключения.
Я понимаю что их можно отключить.
Но это сразу отключает многие фичи буста и стл, и многих других библиотек, без которых ни один крупный проект не обходится.

Так что помечтать можно, а потом надо спуститься на землю и признать что отключать исключения никто не будет, также как и писать throw() на каждую функцию.

Так если гугловцы не используют исключения, они должны их выключать при сборке, либо быть готовым ко всему, что у них записано в CONS.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38392208
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

У гугловцев есть возможность закидать всех шапками (реализовать все необходимые им библиотеки самим).
Так что может и отключают.
Обычные разработчики - не могут себе это позволить.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38392214
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
любой код возврата?пропущено...
Ну да, с++ программист обязан учитывать, что любая функция может выкинуть абсолютно любое исключение, которое непонятно как обрабатывать.
А с-программист обязан учитывать, что любая функция может выкинуть абсолютно любой код возврата, который непонятно как обрабатывать

Вообще, функция должна возвращать свой результат, а не признак успешного завершения.
Я так глубоко убеждён.
И кодирование это на С в старом стиле K&R -- это на самом деле какой-то ад, а не программирование.
Там вот и пишут такие саги на 3 страницы, которые всего-то открывают файл.

Оно конечно, где-то и такой код нужен, и оправдан, но уж больно он черезжопенский.

И ещё на счёт исключений -- я глубоко убеждён, что не любит исключения только тот, кто их не понимает. А не понимает он их только по одной причине -- не хочет понять. Потому что исключения -- очень простая концепция, уже вошедшая во многие современные языки, и ничего сложного в них нет, это очень легко понять. Это даже не conditions из common lisp и не continuation из schema. Это очень просто.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38392228
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivА не понимает он их только по одной причине -- не хочет понять.
Думаю что и претенции к скорости исключений тоже всего лишь повод. Т.к. в подавляющем большинстве случаев скорость не важна.
Намного важнее читаемость и сопровождаемость кода, что как раз дают исключения (если применять с умом)
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38392249
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
MasterZivно если ты не знаешь, что это за исключение будет или не знаешь, что с ним делать -- просто ничего не делайИменно это и предлагается в первом посте топика.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38392255
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyMasterZivА не понимает он их только по одной причине -- не хочет понять.
Думаю что и претенции к скорости исключений тоже всего лишь повод. Т.к. в подавляющем большинстве случаев скорость не важна.
Намного важнее читаемость и сопровождаемость кода, что как раз дают исключения (если применять с умом)
Скорость важна в численных методах к примеру, но там нет места try{..}catch и если
хотят фиксировать деления нуля на ноль то скорее всего выставляют проверяют
NaN в на вершине стека FPU. Эдакая-себе "бесчувственная" молотилка чисел.

Исключения - это всё-таки более высокий уровень и я думаю автор попал на "границу" между
этими уровнями. Пускай хоть скажет что у него за код который якобы нивкоем разе не должен
использовать исключения.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38392269
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Так сказал же - игруха.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38392270
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
любой код возвратаА с-программист обязан учитывать, что любая функция может выкинуть абсолютно любой код возврата, который непонятно как обрабатыватьНо только это не влияет на ход выполнения вашего кода. А с исключениями надо всегда учитывать, что следующая после вызова функции строка кода может и не выполниться.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38392282
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskymayton,

Так сказал же - игруха.
Дак фик его знает. Онаж игруха не только из engine состоит.
Щас игрухи могут содержать вполне себе православный скриптинг. Язык сценариев.
И там вполне возможно механизм exceptions будет полезен.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38392296
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
MasterZivВ Win32/64 бывают и Unhandled non-C++ exceptions...
ну их-то обычно нет смысла перехватывать и пытаться продолжать работу
В Linux/Unix бывают сигналы ...
и после этого программа либо умерла, либо продолжила выполнение с того же места

Проблема с исключениями только в том, что очень легко сделать ошибку, из-за которой после перехвата исключения программа продолжит работу с неправильными данными. Иногда лучше, чтобы всё сразу упало.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38392344
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
MasterZivТак если гугловцы не используют исключения, они должны их выключать при сборке, либо быть готовым ко всему, что у них записано в CONS.не, это означает что любое исключение в стороннем коде - это total crash.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38392465
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
?любой код возвратаА с-программист обязан учитывать, что любая функция может выкинуть абсолютно любой код возврата, который непонятно как обрабатыватьНо только это не влияет на ход выполнения вашего кода. А с исключениями надо всегда учитывать, что следующая после вызова функции строка кода может и не выполниться.

Это не так. Если например не выделилась память, а ты это не проверил через какой-то код возврата
(да хоть тот же malloc на NULL), то первый же код, который эту память будет использовать, упадёт.
Такие же случаи могут быть и с другими видами объектов и функциями.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38392471
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Win32/64 бывают и Unhandled non-C++ exceptions...
ну их-то обычно нет смысла перехватывать и пытаться продолжать работу

Если бы это было бы так, то и исключения SEH никто бы не придумывал. Были бы как в линухе segfault -- и всё.



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


Это не проблема исключений или их отсутствия. Это -- вообще общая проблема программирования.
Когда программируешь, очень легко сделать ошибку.

Ну и что теперь с этим делать, не программировать ?
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38392846
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivИ ещё на счёт исключений -- я глубоко убеждён, что не любит исключения только тот, кто их не понимает. А не понимает он их только по одной причине -- не хочет понять. Потому что исключения -- очень простая концепция, уже вошедшая во многие современные языки, и ничего сложного в них нет, это очень легко понять. Это даже не conditions из common lisp и не continuation из schema. Это очень просто.А я глубоко убежден что я не использую исключения именно потому что понимаю их :) Концепция простая, но излишне подверженная кривому кодированию.
Есть языки где без исключений жить нельзя вообще (почти все функциональные например), но в С++ можно прекрасно жить без исключений.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38392863
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owlно в С++ можно прекрасно жить без исключений
Некоторые и без ног живут, и ставят спортивные рекорды.
Но это не благодаря, а вопреки. :)
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38392887
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlMasterZivИ ещё на счёт исключений -- я глубоко убеждён, что не любит исключения только тот, кто их не понимает. А не понимает он их только по одной причине -- не хочет понять. Потому что исключения -- очень простая концепция, уже вошедшая во многие современные языки, и ничего сложного в них нет, это очень легко понять. Это даже не conditions из common lisp и не continuation из schema. Это очень просто.А я глубоко убежден что я не использую исключения именно потому что понимаю их :) Концепция простая, но излишне подверженная кривому кодированию.
Есть языки где без исключений жить нельзя вообще (почти все функциональные например), но в С++ можно прекрасно жить без исключений.
+1 Прекрасно понимаю. Я-бы и в java жил без Exceptions. Но кто надоумил Гослинга
внедрить такой вот странный workaround вокруг таймаута (try {Thread.sleep(ms);} catch (InterruptedException e) {}).
ИЧСХ по другому этот кусок кода не написать особенно если обёртывающий метод implemented жёстко заданный тип исключения.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38392890
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

А такое что мешает сделать?
Код: plaintext
1.
MyUtils.sleep(ms); 
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38392892
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лень импорты тащить. Или декларации. Я уже докатился до того что создаю
свои atoi, printf в java.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38392900
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Так ошибся получается не тот, кто создал джаву, а тот кто на нее перешел с С :)
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38392902
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гослинг штоли?
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38392904
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton )
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38392917
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я с сей не ушёл.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393014
Anatoly MoskovskyMasterZiv,

У гугловцев есть возможность закидать всех шапками (реализовать все необходимые им библиотеки самим).
Так что может и отключают.
Обычные разработчики - не могут себе это позволить.
Кстати, интересно какой компилятор в Google обычно используют, или тоже пишут свой? :)
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393021
?любой код возвратаА с-программист обязан учитывать, что любая функция может выкинуть абсолютно любой код возврата, который непонятно как обрабатыватьНо только это не влияет на ход выполнения вашего кода. А с исключениями надо всегда учитывать, что следующая после вызова функции строка кода может и не выполниться.
Абсолютно везде, где в коде с кодом возврата идет return, в коде с исключениями идет throw(), и наоборот, и следующая строчка не выполнится после любого из них. В любом случае необходимо сначала обработать ошибку.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393028
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я глубоко убежден что я не использую исключения именно потому что понимаю их :) Концепция простая, но излишне подверженная кривому кодированию.

Это что вот значит?
Ведь так можно по все, что угодно сказать. Циклы — концепция простая, но излишне подвержена кривому кодированию. Классы — ... Но подвержена излише кривому кодированию.

Вон, Торвальдс так про весь С++ говорит.

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

Чем с++ принципиально от них отличается? Чем тебе с++ не функциональный язык?
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393075
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivА я глубоко убежден что я не использую исключения именно потому что понимаю их :) Концепция простая, но излишне подверженная кривому кодированию.

Это что вот значит?
Ведь так можно по все, что угодно сказать. Циклы — концепция простая, но излишне подвержена кривому кодированию. Классы — ... Но подвержена излише кривому кодированию.

Вон, Торвальдс так про весь С++ говорит.И я с ним согласен, поэтому предпочитаю простой C :)

MasterZivЕсть языки где без исключений жить нельзя вообще (почти все функциональные например), но в С++ можно прекрасно жить без исключений.

Чем с++ принципиально от них отличается? Чем тебе с++ не функциональный язык?Можно на С++ писать в функциональной парадигме. Но это вовсе не обязательно.
Можно на С++ писать чисто имеративно. Но это вовсе не обязательно.
Можно на С++ писать на чистом ООП. Но это вовсе не обязательно.
Но вот то что все учебники по С++ пропагандируют жуткую смесь всех трех парадигм - это не только не обязательно, но еще и крыше-срывательно.

Вообще, С++ мне напоминает классическую настольную D&D - можно отыгрывать любого персонажа в меру своей фантазии. Но хорошей игра будет только в том случае если ее ведет хороший dungeon master. Так же и с С++ - можно писать в любом стиле, но хороший проект получится только если есть жесткий лидер группы способный вести проект. И если лидер сказал: "выход из комнаты только на восток", то писать надо именно так - иначе game over и ищи новую работу.
В других языках как-то больше порядка. Есть базовая парадигма, есть стандартный стиль оформления, все учебники следуют общим принципам... И только в С++ что ни учебник, то своя колокольня, что ни библиотека, то свой монастырь.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393084
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
MasterZivЭто не так. Если например не выделилась память, а ты это не проверил через какой-то код возврата
(да хоть тот же malloc на NULL), то первый же код, который эту память будет использовать, упадёт.
Такие же случаи могут быть и с другими видами объектов и функциями.Это просто прекрасно, что сразу упадет. Гораздо хуже, когда внешне прекрасно все работает, но иногда выдает совершенно левые результаты.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393088
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
любой код возвратаАбсолютно везде, где в коде с кодом возврата идет return, в коде с исключениями идет throw(), и наоборот, и следующая строчка не выполнится после любого из них. В любом случае необходимо сначала обработать ошибку.В вызывающем эту функцию коде не выполнится следующая строка, если функция выкинула исключение.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393419
?любой код возвратаАбсолютно везде, где в коде с кодом возврата идет return, в коде с исключениями идет throw(), и наоборот, и следующая строчка не выполнится после любого из них. В любом случае необходимо сначала обработать ошибку.В вызывающем эту функцию коде не выполнится следующая строка, если функция выкинула исключение.
В вызывающем эту функцию коде обязательно надо проверить её код возврата, и если он содержит ошибку, то следующая строка не выполнится, т.к. обязательно делаем break, return, exit...
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393522
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393551
? http://www.transl-gunsmoker.ru/2010/02/blog-post_11.html
автор(Да, есть модели программирования типа RAII и транзакций, но вы редко сможете увидеть пример, который бы их использовал)
Супер!
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393569
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
любой код возврата, ок, возьмите пример из оригинального сообщения
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
BOOL ComputeChecksum(LPCTSTR pszFile, DWORD* pdwResult)
{
  HANDLE h = CreateFile(pszFile, GENERIC_READ, FILE_SHARE_READ,
       NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  HANDLE hfm = CreateFileMapping(h, NULL, PAGE_READ, 0, 0, NULL);
  void *pv = MapViewOfFile(hfm, FILE_MAP_READ, 0, 0, 0);
  DWORD dwHeaderSum;
  CheckSumMappedFile(pvBase, GetFileSize(h, NULL),
           &dwHeaderSum, pdwResult);
  UnmapViewOfFile(pv);
  CloseHandle(hfm);
  CloseHandle(h);
  return TRUE;
}


теперь представьте, что функции вместо возврата кода ошибки кидают исключения и исправьте код :)
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393582
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, парни очень правильно рассуждают, но потом в самом-самом конце почему-то делают ровно противоположные к правильным выводы.

Ну, на самом деле конечно же ни один из выводов "я буду использовать исключения" или "я не буду использовать исключения"
не правильный или неправильный, это скорее вопрос идеологии.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393613
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
?любой код возврата, ок, возьмите пример из оригинального сообщения
теперь представьте, что функции вместо возврата кода ошибки кидают исключения и исправьте код :)
Пишется обертка над HANDLE которая
1) если хендл инвалидный кидает исключение при попытке его прочесть (operator HANDLE())
2) если хендл валидный закрывает его в дестукторе.

Итого код останется точно таким же. :)
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393616
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyИтого код останется точно таким же. :)
Даже сократится за счет ненужности CloseHandle :)
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393632
?любой код возврата, ок, возьмите пример из оригинального сообщения
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
BOOL ComputeChecksum(LPCTSTR pszFile, DWORD* pdwResult)
{
  HANDLE h = CreateFile(pszFile, GENERIC_READ, FILE_SHARE_READ,
       NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  HANDLE hfm = CreateFileMapping(h, NULL, PAGE_READ, 0, 0, NULL);
  void *pv = MapViewOfFile(hfm, FILE_MAP_READ, 0, 0, 0);
  DWORD dwHeaderSum;
  CheckSumMappedFile(pvBase, GetFileSize(h, NULL),
           &dwHeaderSum, pdwResult);
  UnmapViewOfFile(pv);
  CloseHandle(hfm);
  CloseHandle(h);
  return TRUE;
}


теперь представьте, что функции вместо возврата кода ошибки кидают исключения и исправьте код :)
Во-первых эти функции не могут кидать исключения, т.к. это код на C, или по крайней мере в C-style, а не C++.
Во-вторых этот код не верный, т.к. всегда возвращает true!


И не смотря на то, что WinAPI писался для совместимости с C, на RAII и exceptions он в 100 раз более понятный и отлаживаемый - тут уже никак не перепутаешь и не забудешь вызовы CloseHandle/UnmapViewOfFile. В нормальном C++ коде все функции либо уже возвращали бы smart pointers с нужными делитерами, либо вообще все скрывали в конструкторе, как в std::fstream.

Теперь приведите этот же код с кодами возврата:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
BOOL ComputeChecksum(LPCTSTR pszFile, DWORD* pdwResult)
{
  try {
    typedef std::remove_pointer<HANDLE>::type HANDLE_VAL;

    std::unique_ptr<HANDLE_VAL> h (CreateFile(pszFile, GENERIC_READ, FILE_SHARE_READ,
         NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL), 
      [](HANDLE val) { CloseHandle(val); } );

    std::unique_ptr<HANDLE_VAL> hfm (CreateFileMapping(h.get(), NULL, PAGE_READ, 0, 0, NULL),
      [](HANDLE val) { CloseHandle(val); } );

    std::unique_ptr<void> pv (MapViewOfFile(hfm.get(), FILE_MAP_READ, 0, 0, 0), 
      [](void *val) { UnmapViewOfFile(val); } );

    DWORD dwHeaderSum;
    CheckSumMappedFile(pvBase, GetFileSize(h, NULL), &dwHeaderSum, pdwResult);

  } catch(...) {
    return false;
  }
  return true;
}
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393637
Anatoly Moskovsky?любой код возврата, ок, возьмите пример из оригинального сообщения
теперь представьте, что функции вместо возврата кода ошибки кидают исключения и исправьте код :)
Пишется обертка над HANDLE которая
1) если хендл инвалидный кидает исключение при попытке его прочесть (operator HANDLE())
2) если хендл валидный закрывает его в дестукторе.

Итого код останется точно таким же. :)
1 даже не нужно, т.к. по его условию "функции вместо возврата кода ошибки кидают исключения" :)
Но в Ture C++-Style библиотеке это вообще все не нужно, т.к. реализовано и сокрыто в библиотеке.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393655
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в Ture C++-Style библиотеке,

Ну все же в вашем коде много синтаксического мусора.
То что я предложил, оставляет код буквально таким же как привыкли си-шники, но при этом автоматически возникает обработка ошибок.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393665
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
?любой код возврата, ок, возьмите пример из оригинального сообщения
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
BOOL ComputeChecksum(LPCTSTR pszFile, DWORD* pdwResult)
{
  HANDLE h = CreateFile(pszFile, GENERIC_READ, FILE_SHARE_READ,
       NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  HANDLE hfm = CreateFileMapping(h, NULL, PAGE_READ, 0, 0, NULL);
  void *pv = MapViewOfFile(hfm, FILE_MAP_READ, 0, 0, 0);
  DWORD dwHeaderSum;
  CheckSumMappedFile(pvBase, GetFileSize(h, NULL),
           &dwHeaderSum, pdwResult);
  UnmapViewOfFile(pv);
  CloseHandle(hfm);
  CloseHandle(h);
  return TRUE;
}


теперь представьте, что функции вместо возврата кода ошибки кидают исключения и исправьте код :)

Ну, в этом нет ничего сложного. Только необходимо провести подготовительную работу:
- реализовать handle_guard
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
	template<typename T, typename F>
	class handle_guard : noncopyable
	{
		T handle;
		F destructor;
		T invalid_handle;
	public:
		handle_guard(T handle, F destructor, T invalid_handle) : handle(handle), destructor(destructor), invalid_handle(invalid_handle)
		{
		}
		~handle_guard()
		{
			if( handle != invalid_handle )
				destructor(handle);
		}
		T release() {
			T tmp = handle;
			handle = invalid_handle;
			return tmp;
		}
		void reset(T handle) {
			if( this->handle != invalid_handle )
				destructor(this->handle);
			this->handle = handle;
		}
	public:
		operator T() const
		{
			return handle;
		}
	}; // class handle_guard..


- обрамить winapi вызовы

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
    //////////////////////////////////////////////////////////////////////////
    // Константы
    //

    const HANDLE INVALID_HANDLE = NULL;
    const HMODULE INVALIDE_MODULE = NULL;
    const FARPROC INVALIDE_FARPROC = NULL;

    //////////////////////////////////////////////////////////////////////////
    // Типы
    //

    // тип для хранения переменных типа HANDLE
    typedef handle_guard<HANDLE, BOOL (WINAPI*)(HANDLE)> HandleGuard;
    // тип для хранения переменных типа HLOCAL
    typedef handle_guard<HLOCAL, HLOCAL (WINAPI*)(HLOCAL)> LocalMemoryGuard;
    // тип для хранения переменных типа HANDLE
    typedef handle_guard<HMODULE, BOOL (WINAPI*)(HMODULE)> ModuleGuard;

    //////////////////////////////////////////////////////////////////////////
    //  Исключение
    //
    class WinApiException : public std::runtime_error
    {
        // категория (домен) ошибки (сетевая, к примеру, или ошибка базы данных) 
        // определяется приложением
        WORD m_category;

    public:
        explicit WinApiException(const std::string& m, WORD category = 0)
            : std::runtime_error(m), m_category(category)
        {
        }

        explicit WinApiException(const char *m, WORD category = 0)
            : std::runtime_error(m), m_category(category)
        {
        }

        WORD Category() const {
            return m_category;
        }
    }; // class ExecuteException..

    //////////////////////////////////////////////////////////////////////////
    // Утилиты
    // 

    // вернуть объект исключения соответствующий заданному коду ошибки dw
    inline WinApiException GenerateException(WORD category, const std::string& operation, DWORD dw = GetLastError()) {
        HLOCAL lpMsgBuf = 0;
        FormatMessage(
            FORMAT_MESSAGE_ALLOCATE_BUFFER | 
            FORMAT_MESSAGE_FROM_SYSTEM |
            FORMAT_MESSAGE_IGNORE_INSERTS,
            NULL,
            dw,
            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
            (LPTSTR) &lpMsgBuf,
            0, NULL );
        LocalMemoryGuard msgGuard(lpMsgBuf, LocalFree, 0); 
        std::string msg(operation);
        if( !msg.empty() ) 
            msg += ": ";
        if( lpMsgBuf )
            msg += reinterpret_cast<const char*>(lpMsgBuf);
        else
            msg += "failed";
        return WinApiException(msg, category);
    }

    // проверить результат вызова WINAPI функции (result) на успех (successResult) и в случае ошибки
    // выбросить исключение в зависимости от значения resultAsWinError
    template<typename T> T CheckSuccess(WORD category, const std::string& operation, T result, T successResult, BOOL resultAsWinError = FALSE) {
        if( result != successResult ) {
            throw GenerateException(category, operation, resultAsWinError ? result : GetLastError());
        }
        return result;
    }

    // проверить результат вызова WINAPI функции (result) на неуспех (failureResult) и в случае ошибки
    // выбросить исключение
    template<typename T> T CheckFailure(WORD category, const std::string& operation, T result, T failureResult) {
        if( result == failureResult ) {
            throw GenerateException(category, operation, GetLastError());
        }
        return result;
    }



Ну а дальше собственно переписать код

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
BOOL ComputeChecksum(LPCTSTR pszFile, DWORD* pdwResult)
{
  HandleGuard h(
        CheckFailure(0, 
                          "CreateFile", 
                           CreateFile(pszFile, GENERIC_READ, FILE_SHARE_READ,
                                          NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL),
                           INVALID_HANDLE),
        CloseHandle,
        INVALID_HANDLE
  );

  HandleGuard hfm (
        CheckFailure(0, 
                          "CreateFileMapping", 
                           CreateFileMapping(h, NULL, PAGE_READ, 0, 0, NULL),
                           INVALID_HANDLE),
        CloseHandle,
        INVALID_HANDLE
  );
  handle_guard<LPVOID, BOOL (WINAPI*)(LPCVOID)> pv(
        CheckFailure(0, 
                          "MapViewOfFile", 
                           MapViewOfFile(hfm, FILE_MAP_READ, 0, 0, 0),
                           0),
        UnmapViewOfFile,
        0
  );
  DWORD dwHeaderSum;
  CheckSumMappedFile(pvBase, GetFileSize(h, NULL),
           &dwHeaderSum, pdwResult);
  return TRUE;
}
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393667
Anatoly Moskovskyв Ture C++-Style библиотеке,

Ну все же в вашем коде много синтаксического мусора.
То что я предложил, оставляет код буквально таким же как привыкли си-шники, но при этом автоматически возникает обработка ошибок.
Ну обертка над HANDLE могла бы в сумме занять чуть больше места, чем исходный код в рамках данного примера, а сторонник кодов возврата бы этого не понял :)
Ну и для UnmapViewOfFile() пришлось бы все равно либо отдельную обертку делать, либо как у меня писать.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393678
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в Ture C++-Style библиотеке,

Ну естественно суммарный код будет больше, т.к. это должна быть отдельная библиотека, в которой все нужные фичи обернуты в безопасную форму.
А если люди не понимают разницу между прикладным и библиотечным кодом, то им доказывать что либо бессмысленно :)
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393687
В принципе можно ещё так упростить :)

Код: plaintext
1.
2.
3.
4.
5.
// In lib:
typedef std::remove_pointer<HANDLE>::type HANDLE_VAL;
std::unique_ptr<HANDLE_VAL> get_handle(HANDLE val) { 
 return std::unique_ptr<HANDLE_VAL>(val, [](HANDLE val) { CloseHandle(val); } ); 
}


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
BOOL ComputeChecksum(LPCTSTR pszFile, DWORD* pdwResult)
{
  try {
    auto h =get_handle(CreateFile(pszFile, GENERIC_READ, FILE_SHARE_READ,
         NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL));

    auto hfm = get_handle(CreateFileMapping(h.get(), NULL, PAGE_READ, 0, 0, NULL));

    std::unique_ptr<void> pv (MapViewOfFile(hfm.get(), FILE_MAP_READ, 0, 0, 0), 
      [](void *val) { UnmapViewOfFile(val); } );

    DWORD dwHeaderSum;
    CheckSumMappedFile(pvBase, GetFileSize(h.get(), NULL), &dwHeaderSum, pdwResult);

  } catch(...) {
    return false;
  }
  return true;
}
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393699
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно ещё так упроститьВ принципе можно ещё так упростить :)


Показательный пример мощи современного С++. Спасибо. Отличный пример. Мой же пример "дореволюционного подхода" явно многословен, хотя успешно позволял нам писать во времена VC6. Да, прогресс не остановить.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393714
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stuffy.reg...не обрабатывать исключения ? ...

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

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

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

всё остальное - от лукавого.
удачи вам
(круглый)
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393738
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное исходник С++ бесполезно рассматривать в вакууме. Нужно
какое-то code convention. Думаю это code convention и имел в виду PM.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393807
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
Ну понакидали кучу вариантов. Но, возвращаясь к изначальному вопросу, ни в одном из этих вариантов почему-то нет явной обработки исключений :)
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393813
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
а, не, в одном есть:
Код: plaintext
1.
2.
3.
  } catch(...) {
    return false;
  }

и это ужас-ужас-ужас... так нельзя...
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393843
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
?Ну понакидали кучу вариантов. Но, возвращаясь к изначальному вопросу, ни в одном из этих вариантов почему-то нет явной обработки исключений :)
Так явная обработка не нужна.
Точнее она нужна, но не в этом низкоуровневом коде.
Пока не будет понимания что исключения не нужно обрабатывать тут же, вам так и будет казаться что от них одни проблемы :)
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393866
?а, не, в одном есть:
Код: plaintext
1.
2.
3.
  } catch(...) {
    return false;
  }

и это ужас-ужас-ужас... так нельзя...
По вашей ссылке всё ещё в разы хуже.
В этом примере больше и не нужно, а у вас просто необоснованный страх перед неизвестным для вас механизмом исключений.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393944
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
Проблема в поддержке чужого кода.
Ну вот есть некая программа, устанавливается как сервис, типа должна всегда работать, нельзя чтобы упала. Ну и вставили разработчики там "чтобы не упала" catch(...){}. Когда из-за утечки она начала кидать bad_alloc, перехватывать его и пытаться продолжать работать... да лучше бы она упала.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393956
?Проблема в поддержке чужого кода.
Ну вот есть некая программа, устанавливается как сервис, типа должна всегда работать, нельзя чтобы упала. Ну и вставили разработчики там "чтобы не упала" catch(...){}. Когда из-за утечки она начала кидать bad_alloc, перехватывать его и пытаться продолжать работать... да лучше бы она упала.
Чего вы там выдумываете? Приведите пример вашей правильной реализации на C++ этого примера с кодами возврата.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393965
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щас читаю Scala Хорстмана. Интересно он там про checked Exceptions написал. Чуть позже отквотирую.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393973
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
Приведите примерЧего вы там выдумываете? Приведите пример вашей правильной реализации на C++ этого примера с кодами возврата.
Да причем тут коды возврата? Нельзя делать catch(...) без перевыбрасывания исключения. То есть эту конструкцию можно применять только в контексте
Код: plaintext
1.
catch(...) { rollback(); throw; }
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393978
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
Искать баги в чужом коде, использующем исключения, сложнее, чем в коде, не использующем исключения... Это кто-то будет оспаривать?
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393998
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot MasterZiv]Anatoly MoskovskyПро отключенные исключения.

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

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

И это правильно - ибо при исключении в винде происходит first chance exception и отлаживать потом такое приложение в windbg становится невозможным из-за обилия исключений
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38394031
?Искать баги в чужом коде, использующем исключения, сложнее, чем в коде, не использующем исключения... Это кто-то будет оспаривать?
В вашем коде да.
?Приведите примерЧего вы там выдумываете? Приведите пример вашей правильной реализации на C++ этого примера с кодами возврата.
Да причем тут коды возврата? Нельзя делать catch(...) без перевыбрасывания исключения . То есть эту конструкцию можно применять только в контексте
Код: plaintext
1.
catch(...) { rollback(); throw; }


И что же в моем примере должен делать rollback() и почему я не могу вернуться по флагу(коду) возврата return false - неужели использовать код возврата это так ужасно?
Вы свой пример кода приведите и вам сразу станет очевидно какую чушь вы несете :)
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38394208
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lepsikвы непоняли что написано - они не используют исключения для управления логикой приложения как это сделано в жабе и шарпе.

Думаю, это вы не поняли. Исключения как концепция не предполагает вообще управление логикой.
В джаве и шарпе тоже никто не использует исключения для управления логикой.
Вернее использовать-то их можно (как и в С++), но те, кто используют - это те же кто потом говорит, что исключения хуже чем коды возврата.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38394209
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
?Искать баги в чужом коде, использующем исключения, сложнее, чем в коде, не использующем исключения... Это кто-то будет оспаривать?
Да. Оспариваем. :)
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38394237
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyLepsikвы непоняли что написано - они не используют исключения для управления логикой приложения как это сделано в жабе и шарпе.

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


похоже что английский для вас не родной, но я таки дам вам статью где таки да критикуют это - http://www.ibm.com/developerworks/java/library/j-jtp05254/index.html

И это часть концепции девелопмента в жабе и С# даже в крупных компаниях когда кидают исключение не только вместо кода ошибки но для управления логики.

пример - catching NoSuchElementException when calling Iterator.next() instead of first checking Iterator.hasNext()

и такого кода я за годы существования C# и java я разгреб тонны и вы будете мне сказки рассказывать

вот вам пример из учебника по жабе

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public void readPreferences(String filename)
    throws IllegalArgumentException
{
    if (filename == null)
    {
        throw new IllegalArgumentException
                            ("filename is null");
    }  //if
    
    //...perform other operations...
    
    InputStream in = new FileInputStream(filename);
    
    //...read the preferences file...
}



https://today.java.net/pub/a/today/2003/12/04/exceptions.html


Пример для С++: MSSQL 2000 под отладчиком сыпет тонны first chance exceptions по любому запросу и при старте, к счастью, начиная с MSSQL2005 они этот порочный путь оставили.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38394526
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky?Искать баги в чужом коде, использующем исключения, сложнее, чем в коде, не использующем исключения... Это кто-то будет оспаривать?
Да. Оспариваем. :)

Я бы тоже поспорил.
С исключениями код проще, легче читается, проще понимается.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38394539
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lepsik,

авторИ это часть концепции девелопмента в жабе и С# даже в крупных компаниях когда кидают исключение не только вместо кода ошибки но для управления логики.

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

Но там было чётко написано (перевожу на русский) -- "Мы не используем исключения".

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

Если расширить толкование, это может значить три вещи (как я понимаю).

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

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

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


На самом деле в реальности либо 1, либо 3, 2-й сценарий нереальный.
Ну а если они ловят искл. наверху, то должны будут ловить иногда и в других местах, локальных. Это уже неиспользванием исключений не назвать.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38394598
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LepsikNoSuchElementException IllegalArgumentException
Это два примера, когда как раз к логике исключения не имеют отношения.
Это обычная защита от дурака. В первом случае дурак не проверил что итератор завершен и продолжает его использовать, а во втором - передал в функцию левые аргументы.
Это не элементы логики, а именно исключительная ситуация.

Причем заметьте, что сама джава не заставляет вас использовать например NoSuchElementException для проверки итератора - у вас есть hasMoreElements hasNext
Это кто-то слишком умный у себя решил вместо if применить catch, а вы почему-то именно к джаве претензии предъявляте.

Lepsikдаже в крупных компаниях
В крупных компаниях процент дураков такой же как и в мелких. А абсолютном значении - их гораздо больше :)
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38394687
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это зависит от специфики проекта. Код, откомпилированный без поддержки исключений, более компактен. Если это embedded-задачи, то там это может быть важно. В этом случае их нельзя ни бросать, ни обрабатывать.
Может, например, у них в планах шить код в железку низкоресурсную, поэтому они заблаговременно к этому готовятся.

что касается обычных задач, где ресурсов достаточно... Я вот замечал, что даже в java даже в распространенных либах иногда встречаются "лишние" обработки исключений, которые только мешают. Может у них там разработка так поставлена, что вам просто это делать не надо. Исключения обрабатываются на том уровне, где известно что с ними делать. Но некоторые особо упоротые везде понаставляют try-catch c последующим rethrow и потом сиди их выковыривай.

я бы на вашем месте спроил у тимлида че это он так. Наверняка на это есть причина.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38394985
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapok...embedded-задачи, то там...

...Исключения обрабатываются на том уровне, где известно что с ними делать. Но некоторые особо упоротые везде понаставляют try-catch c последующим rethrow и потом сиди их выковыривай.....

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

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

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

(круглый)
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38395176
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иногда в деструкторах хочется совершать действия не вызывающие обратной связи.
Ну толкнуть .close для всех объектов connection, files, handles e.t.c. Что там
он выбросит- пофиг. Это уже не важно. Это завершающие действия, фидбэк
по которым неинтересен. Закрыт хендл и леший с ним.
...
Рейтинг: 0 / 0
97 сообщений из 97, показаны все 4 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Обработка исключений отсутствует
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]