Большой Воронежский Форум
» Программирование>C++ вопросик
Hopkroft 22:25 26.10.2012
1. Правильно ли в консольном приложении для задержки экрана использовать system ("pause")?
2. Для того что-бы приложение обрабатывало исключительные ситуации вроде деления на ноль. Ставлю в Свойствах проекта у поля Code Generation (вкладка С++) свойство Enable C++ Exception -> Yes with Seh exception.
Потом соответственно ловлю через
Код:
 try 
  {
    for (i=15; i>-1;--i)
    {
      cout<<i<<endl;
      j/=i;
    }
  }
  catch(...)
  {
    cout<<"Division by 0"<<endl;
  }
Т.е. это и есть механизм отлова исключительных (аномальных) ситуаций. Или можно другие настройки покрутить? [Ответ]
Battle Coder 23:51 26.10.2012
Hopkroft, откройте что ли любую книжку по С++ (их навалом) - там и про обработку исключений есть... [Ответ]
Hopkroft 00:07 27.10.2012

Сообщение от Battle Coder:
Hopkroft, откройте что ли любую книжку по С++ (их навалом) - там и про обработку исключений есть...

Блин кэп, ну вот как ты думаешь откуда я этот код взял?
Но не во всех книжках описаны тонкости работы с конкретной средой. Например в Липпмане, просто описан механизм, без привязки к конкретной среде. Поэтому и спросил, людей которые более детально разбирались.
[Ответ]
Battle Coder 12:54 28.10.2012
Hopkroft, ну C++ знаю плоховато (начинал изучать, бросил от нехватки времени, может потом ещё вернусь). В той же java схема такая:
try {
код, который может вызывать исключение
код, который выполняется, если исключения нет (всё хорошо)
} catch (Исключение1 e) {
обработка
...
} catch (ИсключениеN e {
обработка
} finally {
что нужно вызывать ОБЯЗАТЕЛЬНО (закрыть открытые файлы, сокеты, подключения к БД и т.п.)
}

что конкретно непонятно? Думаю ,в плюсах всё если не в точности также, то очень похоже. [Ответ]
silly 16:20 28.10.2012

Сообщение от :
Думаю ,в плюсах всё если не в точности также, то очень похоже.

В плюсах нет блока finally и много еще всяких хм… нюансов.

Сообщение от Hopkroft:
1. Правильно ли в консольном приложении для задержки экрана использовать system ("pause")?

Всем пофиг. Хотя не солидно, конечно. [Ответ]
Hopkroft 19:16 28.10.2012

Сообщение от Battle Coder:
что конкретно непонятно? Думаю ,в плюсах всё если не в точности также, то очень похоже.

Просто если в настройках проекта не поставишь галки, то сама среда перехватывает исключение.
Как сделать так, что-бы исключение могла обрабатывать программа, и если не смогла его обработать то передала операционке?
Просто неудобно когда работаешь с исключениями сама IDE его пытается обработать. [Ответ]
Hopkroft 19:19 28.10.2012

Сообщение от silly:
Всем пофиг. Хотя не солидно, конечно.

Т.е. лучше делать так
Код:
char ch;
std::cin.get(&ch);
А перед этим очищать буффер ввода на всякий "пожарный"? [Ответ]
silly 20:31 28.10.2012
Disclaimer: я в с++ тоже не соображаю.

Сообщение от Hopkroft:
Как сделать так, что-бы исключение могла обрабатывать программа, и если не смогла его обработать то передала операционке?

Тут вроде как есть альтернативный подход с использованием _set_se_translator(). Отлов сразу всех seh-исключений представляется мне опасным.

http://stackoverflow.com/questions/4...r-c-exceptions

http://stackoverflow.com/questions/1...-studio-2008-c

Сообщение от Hopkroft:
А перед этим очищать буффер ввода на всякий "пожарный"?

Хм… Не знаю, скорее всего нет, не очищать, раз уж реальная причина не придумывается. [Ответ]
Hopkroft 20:47 28.10.2012

Сообщение от silly:
Disclaimer: я в с++ тоже не соображаю.

однако нагуглил несколько интересных ссылок. Спасибо, буду разбираться!
UPD. Вообщем народ очень рекомендует сконцентрироваться на проверке предварительных условий. или как уже было сказано использовать _set_se_translator(). [Ответ]
Battle Coder 09:04 05.11.2012

Сообщение от Hopkroft:
Просто если в настройках проекта не поставишь галки, то сама среда перехватывает исключение.

/0
узнаю много нового. Это особенность C++ как ЯП, или особенность среды? Или я просто неправильно понял? А что за среда-то хоть, вы не написали? [Ответ]
Hopkroft 11:07 05.11.2012

Сообщение от Battle Coder:
/0
узнаю много нового. Это особенность C++ как ЯП, или особенность среды? Или я просто неправильно понял? А что за среда-то хоть, вы не написали?

Среда Visual Studio 2008.
Как я понял, среда брала на себя всю работу по обработке исключительных ситуаций вроде деления на 0. Как оказалось люди не рекомендуют обрабатывать самим эти исключительные ситуации и советуют проверять условия, что-бы не допустить их.
Один из моментов когда их рекомендуют обрабатывать, это если вы пользуетесь сторонней библиотекой, которая может иногда выдавать исключительные ситуации. Вот тогда их и рекомендуют перехватывать. Хотя на мой взгляд лучше использовать другую версию библиотеки или вообще другую библиотеку. [Ответ]
silly 16:08 05.11.2012

Сообщение от Battle Coder:
/0
узнаю много нового. Это особенность C++ как ЯП, или особенность среды? Или я просто неправильно понял? А что за среда-то хоть, вы не написали?

В visual studio два вида исключений: из стандарта c++ и «от майкрософта» (structured exceptions). [Ответ]
Shoroh 20:54 27.11.2012
1. я юзал getch(), если праваильно понял-ждет нажатия любой клавиши.
2. можешь сам проверять что бы то на что ты делишь было не ноль, и гененирь исключение(если нужно) или чего то там вызывать...
типа
if(i ==0){
\\тут обработка если И=нулю
} [Ответ]
Hopkroft 21:12 27.11.2012

Сообщение от Shoroh:
1. я юзал getch(), если праваильно понял-ждет нажатия любой клавиши.

Аналогично, но хотел узнать альтернативу.

Сообщение от Shoroh:
2. можешь сам проверять что бы то на что ты делишь было не ноль, и гененирь исключение(если нужно) или чего то там вызывать...
типа
if(i ==0){
\\тут обработка если И=нулю
}

Это идеальный вариант. А что по поводу ситуации когда юзешь библиотеку, одна из функций которой вываливает исключительную ситуацию, исходников нету, вместо этого dll файл. [Ответ]
RedName 09:18 28.11.2012
В этих ваших плюсах try - catch нет чтоле? [Ответ]
Shoroh 10:31 28.11.2012
эту функцию в трай блок значит. с соот-й обработкой того самого исключения. [Ответ]
Вверх