Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
sfinexer
-6 / 8 / 2
Регистрация: 22.01.2011
Сообщений: 152
#1

min-gw try-catch почемуто не работает - C++

09.04.2012, 22:52. Просмотров 1065. Ответов 15
Метки нет (Все метки)

Немогу понять почему не обрабатывается исключение, код приведен ниже.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <cstdlib>
#include <iostream>
#include <windows.h>
#include <stdexcept>
using namespace std;
int main()
{
   int i ,j,k;  
   try
   {
     cin>>i;
     cin>>j;
     k=i/j;
     cout<<k;
   }
   catch (...)
   {
      cerr << "ERROR"<< endl;
   }
   system("pause");
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.04.2012, 22:52
Здравствуйте! Я подобрал для вас темы с ответами на вопрос min-gw try-catch почемуто не работает (C++):

Массив: Получить min(a1;a2;a3)+min(a4;a5;a6)+min(a7;a8;a9)+min(a10;a11;a12) . - C++
Заполнить массив а1,а2,а3...а12 случайными числами от 0 до 20. Получить min(a1;a2;a3)+min(a4;a5;a6)+min(a7;a8;a9)+min(a10;a11;a12) .

Не работает try catch - C++
пишу такой код try{ int k=0; int i=44/k;} catch(...) {cout&lt;&lt;&quot;OSIBKA BLIN &quot;&lt;&lt; endl;} но программа зависает как будто...

как работает try, catch - C++
Как работает конструкция try, catch? Если не сложно объясните на не большом примере. А то гугли читал в книги так не могу понять ее...

Работает ли указатель на базовый класс исключения, когда попадает в блок catch - C++
Работает ли указатель на базовый класс исключения, когда попадает в блок catch так же как обычно? То есть, если есть переопределенные...

Даны натуральные цифры a,b,c. Вычислите (min(a+c, a+b)+min(a-b,b-c))/(1-min(ab+c,1.2) - C++
На С++.

Даны действительные числа a, b, c. Получить r = (min (a, a + b)+min(a,b+c)/1+min(a+bc,b) - C++
Для решении использовать функцию! Даны действительные числа a, b, c. Получить r = (min (a, a + b)+min(a,b+c))/1+min(a+bc,b)

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
panicwassano
592 / 560 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
09.04.2012, 23:19 #2
а вы catch какое исключение перехватываете? что барин написал, то компилятор и сделал
0
kazak
09.04.2012, 23:57
  #3

Не по теме:

Цитата Сообщение от panicwassano Посмотреть сообщение
а вы catch какое исключение перехватываете?
Подозреваю,что стандартное.

0
sfinexer
-6 / 8 / 2
Регистрация: 22.01.2011
Сообщений: 152
10.04.2012, 02:03  [ТС] #4
Как я понял, согласно описанию кетча формат (...) должен перехватывать ВСЕ исключения.
Но не понимаю почему не работает(
Мне бы для начала попасть бы в этот catch...
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
10.04.2012, 03:24 #5
sfinexer, а I/O в С++ по умолчанию исключений не кидает:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
int main()
{
    std::cin.exceptions(std::istream::failbit | std::istream::badbit);
    
    try
    {
    int i;
    int k;
    std::cin >> i >> k;
    std::cout << i / k << std::endl;
    }
    catch(const std::ios_base::failure& fail)
    {
    std::cerr << fail.what() << std::endl;
    return 1;
    }
}
Или ты хотел поймать деление на ноль? Не получится (по крайней мере, стандартными средствами)
1
IPtv
8 / 8 / 0
Регистрация: 10.04.2012
Сообщений: 34
10.04.2012, 03:59 #6
Цитата Сообщение от sfinexer Посмотреть сообщение
Как я понял, согласно описанию кетча формат (...) должен перехватывать ВСЕ исключения.
Но не понимаю почему не работает(
Мне бы для начала попасть бы в этот catch...
деление на 0 - аппаратная ошибка, под винду словить можно через SEH

C++
1
2
3
4
5
6
7
8
9
10
int zero = 0;
 
__try
{
    1/zero;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
    cout << "div by zero\n";
}
с помощью try{}catch{} можно поймать только программные исключения, что бы их "бросить" используется ключевое слово throw
0
sfinexer
-6 / 8 / 2
Регистрация: 22.01.2011
Сообщений: 152
10.04.2012, 15:46  [ТС] #7
Nameless One, У меня почемуто не получается, не выходит в кетч, программа просто киляется системой и все(


IPtv, компилятор ругается на __except(EXCEPTION_EXECUTE_HANDLER)
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
10.04.2012, 15:48 #8
sfinexer, еще раз говорю, деление на ноль НЕ кидает исключений, поэтому и «не выходит в кетч». Ошибки же ввода-вывода успешно ловятся
0
IPtv
8 / 8 / 0
Регистрация: 10.04.2012
Сообщений: 34
10.04.2012, 21:49 #9
Цитата Сообщение от sfinexer Посмотреть сообщение
Как я понял, согласно описанию кетча формат (...) должен перехватывать ВСЕ исключения.
Но не понимаю почему не работает(
Мне бы для начала попасть бы в этот catch...
Цитата Сообщение от sfinexer Посмотреть сообщение
Nameless One, У меня почемуто не получается, не выходит в кетч, программа просто киляется системой и все(


IPtv, компилятор ругается на __except(EXCEPTION_EXECUTE_HANDLER)
мда.
try/catch/throw механизм исключений (программных) уровня языка. что бы его использовать необходимо в блоке try вызывать throw - тогда упраление передаётся подходящему блоку catch. этот механизм не ловит аппаратные ошибки (деление на 0, переполнение и прочие радости) и системные ошибки (чтение/запись по левому адресу, проблемы безопасности). он работает только на уровне языка.

что бы перехватить исключение вызванное инструкцией
C++
1
int i = 1/0;
(которая не вызывает throw, а озадачивает процессор, который дальше спихивает эту проблему на ОС) существует SEH (Structured Exception Handling) в винде, на posix системах эту работу выполняют сигналы.

исключения с++ и SEH разные вещи. первые есть в любом компиляторе вторые только у MS и на винде. да, при включении SEH (/EHa) компилятор создаёт код позволяющий через catch(...) ловить не только языковые но и системные исключения (см. ссылку выше), но надо отдавать себе отчёт, что это не стандартное поведение, а просто разработчики из MS решили, что так будет удобнее.
на mingw, кстати, пытались реализовать поддержку SEH и вроде как никак (на 2008 год по крайней мере, может сейчас и есть что рабочее).
0
sfinexer
-6 / 8 / 2
Регистрация: 22.01.2011
Сообщений: 152
12.04.2012, 21:18  [ТС] #10
Хорошо, но тут то в чем дело тогда...

C++
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
#include <cstdlib>
#include <iostream>
#include <windows.h>
#include <stdexcept>
using namespace std;
int main()
{
   int i ,j,k;
   int m[10];
   try
    {
     cin>>i;
     cin>>j;
     m[i]=i;
     m[j]=j;
     k=m[i]/m[j];
     cout<<k;
   }
   catch(...)
   {
      cerr << "ERROR"<< endl;
      system("pause");
   }
   system("pause");
}
Ведь явно возможно залезать за массив, почему же кэтчь то не работает(
Параметры компиляции такие
-fexceptions -fverbose-asm -pg -g3 -march=native
Уж помоему все включено в компиляцию что тока можно...
0
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
12.04.2012, 21:32 #11
в Си/С++ выход за пределы массива не котролируется
учите матчасть накоц...
0
sfinexer
-6 / 8 / 2
Регистрация: 22.01.2011
Сообщений: 152
12.04.2012, 21:44  [ТС] #12
Цитата Сообщение от Jupiter Посмотреть сообщение
в Си/С++ выход за пределы массива не котролируется
учите матчасть накоц...
Я знаю что не контролируется, но может можно сделать чтобы контролировался???

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

Должны же быть методы отладки, обработки исключений в случае если я улезу на несуществующий указатель, или гдето случайно разделю на ноль..
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
13.04.2012, 03:27 #13
Цитата Сообщение от sfinexer Посмотреть сообщение
Ведь явно возможно залезать за массив, почему же кэтчь то не работает(
а он не должен работать в данном случае. Как и в С, поведение С++ при выходе за границы массива не определено, а об исключениях тут и говорить ни к чему. Для GCC, правда, есть патч, который вводит флаг -fbounds-checking, который завершает программу и обильно гадит в stderr при выходе за границы массива. Но исключений не бросает.

Цитата Сообщение от sfinexer Посмотреть сообщение
Уж помоему все включено в компиляцию что тока можно...
ты бы почитал, что вообще делают эти флаги.
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
13.04.2012, 03:31 #14
Цитата Сообщение от sfinexer Посмотреть сообщение
У меня в программе гдето ошибка, причем хз где, и хз какая, результат работы глупость.
если у тебя такая же программа, как и та, что ты привел в примере выше, то неудивительно.

Цитата Сообщение от sfinexer Посмотреть сообщение
Мне нужен хоть какойнить метод контроля.
Должны же быть методы отладки, обработки исключений в случае если я улезу на несуществующий указатель, или гдето случайно разделю на ноль..
Таких методов куча. Можно использовать отладчики, можно воткнуть assert'ов везде где можно, можно использовать отладочную печать и трассировку, etc. А вообще, в gdb (да и в любом отладчике) можно точно узнать место, где программа упала.
0
sfinexer
-6 / 8 / 2
Регистрация: 22.01.2011
Сообщений: 152
15.04.2012, 23:08  [ТС] #15
Цитата Сообщение от Nameless One Посмотреть сообщение
А вообще, в gdb (да и в любом отладчике) можно точно узнать место, где программа упала.
В том и дело, что она не падает, деления на ноль нету, но ошибка явная гдето есть(
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.04.2012, 23:08
Привет! Вот еще темы с ответами:

Почему не работает MIN ? - C++
#include&lt;iostream&gt; using namespace std; int main(){ setlocale(0,&quot;&quot;); int i, massiv;

Почемуто всеравно выходить true = 1 - C++
#include &lt;iostream&gt; using namespace std; int main() { bool boolean = 260; if (boolean){ cout &lt;&lt;&quot;true...

в IE почемуто не работает - HTML, CSS
вот такой код: &lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;Социальная сеть&lt;/title&gt;...

HP g6 почемуто клавиатура не работает (купил месяц назад) - Ноутбуки
Друзья у меня новый бук hp g6 купил месяц назад вчера почемуто клавиатура не работал и щас не работает но мышка работает помогите...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
15.04.2012, 23:08
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru