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

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

Восстановить пароль Регистрация
 
sfinexer
-7 / 7 / 2
Регистрация: 22.01.2011
Сообщений: 137
09.04.2012, 22:52     min-gw try-catch почемуто не работает #1
Немогу понять почему не обрабатывается исключение, код приведен ниже.
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");
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
panicwassano
591 / 559 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
09.04.2012, 23:19     min-gw try-catch почемуто не работает #2
а вы catch какое исключение перехватываете? что барин написал, то компилятор и сделал
kazak
09.04.2012, 23:57
  #3

Не по теме:

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

sfinexer
-7 / 7 / 2
Регистрация: 22.01.2011
Сообщений: 137
10.04.2012, 02:03  [ТС]     min-gw try-catch почемуто не работает #4
Как я понял, согласно описанию кетча формат (...) должен перехватывать ВСЕ исключения.
Но не понимаю почему не работает(
Мне бы для начала попасть бы в этот catch...
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
10.04.2012, 03:24     min-gw try-catch почемуто не работает #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;
    }
}
Или ты хотел поймать деление на ноль? Не получится (по крайней мере, стандартными средствами)
IPtv
8 / 8 / 0
Регистрация: 10.04.2012
Сообщений: 34
10.04.2012, 03:59     min-gw try-catch почемуто не работает #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
sfinexer
-7 / 7 / 2
Регистрация: 22.01.2011
Сообщений: 137
10.04.2012, 15:46  [ТС]     min-gw try-catch почемуто не работает #7
Nameless One, У меня почемуто не получается, не выходит в кетч, программа просто киляется системой и все(


IPtv, компилятор ругается на __except(EXCEPTION_EXECUTE_HANDLER)
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
10.04.2012, 15:48     min-gw try-catch почемуто не работает #8
sfinexer, еще раз говорю, деление на ноль НЕ кидает исключений, поэтому и «не выходит в кетч». Ошибки же ввода-вывода успешно ловятся
IPtv
8 / 8 / 0
Регистрация: 10.04.2012
Сообщений: 34
10.04.2012, 21:49     min-gw try-catch почемуто не работает #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 год по крайней мере, может сейчас и есть что рабочее).
sfinexer
-7 / 7 / 2
Регистрация: 22.01.2011
Сообщений: 137
12.04.2012, 21:18  [ТС]     min-gw try-catch почемуто не работает #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
Уж помоему все включено в компиляцию что тока можно...
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
12.04.2012, 21:32     min-gw try-catch почемуто не работает #11
в Си/С++ выход за пределы массива не котролируется
учите матчасть накоц...
sfinexer
-7 / 7 / 2
Регистрация: 22.01.2011
Сообщений: 137
12.04.2012, 21:44  [ТС]     min-gw try-catch почемуто не работает #12
Цитата Сообщение от Jupiter Посмотреть сообщение
в Си/С++ выход за пределы массива не котролируется
учите матчасть накоц...
Я знаю что не контролируется, но может можно сделать чтобы контролировался???

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

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

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

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

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

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

Или воспользуйтесь поиском по форуму:
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
16.04.2012, 04:42     min-gw try-catch почемуто не работает #16
sfinexer, расставь в подозрительных местах assert'ы и проверяй входные данные
Yandex
Объявления
16.04.2012, 04:42     min-gw try-catch почемуто не работает
Ответ Создать тему
Опции темы

Текущее время: 12:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru