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

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

Войти
Регистрация
Восстановить пароль
 
kraborak
1 / 1 / 0
Регистрация: 05.09.2013
Сообщений: 45
#1

Как работать с try - catch в С++? - C++

13.03.2014, 15:59. Просмотров 382. Ответов 6
Метки нет (Все метки)

Доброго времени суток. Подскажите плиз как именно работает try catch? Я попробовал сделать вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void f1() {
    int i = 5;
    int j = 0;
    int a = i/j; //вот она - непредвиденная ошибка
}
 
void f2() {
    f1();
}
 
void f3() {
    f2();
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    try {
        f3();
 
    } catch(...) { //как вариант - обрабатываем ВСЕ ошибки
        printf("Exception! Other!!!\n");
    }
}
и нарвался на ошибку т.е. catch не работает.

Насколько я понял из танцев с бубном и изучением различной литературы чтобы сработал catch необходимо в строке, в которой может произойти ошибка, бросить throw. Конкретно в этом примере если в ф-ции f3 ДО вызова ф-ции f2 написать throw 1; и обработку catch(int i) тогда все отлавливается нормально.

Теперь непосредственно вопрос. Существует ли возможность отлова ошибки без throw (я в каком-то блоке НЕ жду ошибки считая что блок надежен но из-за фазы луны и среднестатистической температуры на марсе она все же вылетает и нужно ее отловить) как это сделано в Delphi?

Delphi
1
2
3
4
5
try begin
i = 5/0;
end except begin
print("Ошибка!");
end;
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
12890 / 7276 / 811
Регистрация: 27.09.2012
Сообщений: 17,975
Записей в блоге: 2
Завершенные тесты: 1
13.03.2014, 16:03     Как работать с try - catch в С++? #2
Потому что это не исключительная ситуация
John Prick
771 / 704 / 128
Регистрация: 27.07.2012
Сообщений: 2,015
Завершенные тесты: 3
13.03.2014, 16:09     Как работать с try - catch в С++? #3
Цитата Сообщение от Croessmah Посмотреть сообщение
Потому что это не исключительная ситуация
Почему же. Вот что выдаёт отладчик:
Необработанное исключение в "0x004114f0" в "06 try catch.exe": 0xC0000094: Integer division by zero.
castaway
Эксперт С++
4880 / 3016 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
13.03.2014, 16:23     Как работать с try - catch в С++? #4
Отладчик - это отладчик. В C++ деление на ноль не является исключением.
Croessmah
Модератор
Эксперт CЭксперт С++
12890 / 7276 / 811
Регистрация: 27.09.2012
Сообщений: 17,975
Записей в блоге: 2
Завершенные тесты: 1
13.03.2014, 16:26     Как работать с try - catch в С++? #5
Цитата Сообщение от John Prick Посмотреть сообщение
Вот что выдаёт отладчик:
SEH исключение, каким боком тут исключения C++?

Добавлено через 2 минуты
Цитата Сообщение от kraborak Посмотреть сообщение
Существует ли возможность отлова ошибки без throw
для VC++ http://www.avprog.narod.ru/progs/exceptions.htm и смотрите в сторону EXCEPTION_INT_DIVIDE_BY_ZERO, но лучше всё-таки работать стандартными средствами в данном случае, имхо.
dzrkot
zzzZZZ...
518 / 348 / 53
Регистрация: 11.09.2013
Сообщений: 1,995
13.03.2014, 16:31     Как работать с try - catch в С++? #6
вам бы надо сделать какой-нить class Error , и вызывать его по исключению

C++
1
2
3
4
5
6
7
8
9
int f1() 
{
int i = 5; 
int j = 0; 
if (j==0)
throw Error();  //вот она - непредвиденная ошибка 
else
return  i/j;
}
дальше уже
C++
1
2
3
4
catch(Error &asd)
{
cout<<"Error! j = 0 !";
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.03.2014, 17:47     Как работать с try - catch в С++?
Еще ссылки по теме:

C++ Try и catch
C++ Разъясните подробно, как работают Try-catch
C++ Try catch
Обработка любых исключений в try catch на C++ также как на C# C++
Как реализовать проверку типа переменной с помощью try/catch? C++

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

Или воспользуйтесь поиском по форуму:
kraborak
1 / 1 / 0
Регистрация: 05.09.2013
Сообщений: 45
13.03.2014, 17:47  [ТС]     Как работать с try - catch в С++? #7
dzrkot, да, все верно НО я спрашивал немного про другое =) Нельзя ли сделать это без throw т.е. не проверяя все возможные или невозможные варианты в каждой строчке кода а просто обернуть небезопасный блок строк конструкцией try catch (в delphi try except)?

Добавлено через 11 минут
dzrkot, спасибо, это годится) Вариант:
C++
1
2
3
4
5
6
7
__try {
        f3();
 
    } 
    __except(EXCEPTION_EXECUTE_HANDLER) {
        printf("ERROR!!!\n");
    }
работает примерно как нужно НО... VC++ и #include <windows.h> немножечко напрягает

Добавлено через 48 секунд
ех сори, это Croessmah, подсказал =)
Yandex
Объявления
13.03.2014, 17:47     Как работать с try - catch в С++?
Ответ Создать тему
Опции темы

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