Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Исключения 
:(
    Опции темы
tofreesky
Дата 30.6.2010, 01:55 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 152
Регистрация: 9.6.2010

Репутация: нет
Всего: нет



try
{
 int i = i/i-i;
}
except
{
 MessageBox(0,"except","",0);
}

Такая конструкция не работает, как записать правильно?
PM MAIL   Вверх
mrbrooks
Дата 30.6.2010, 07:55 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 19
Всего: 306



мда. книгу почитать не судьба. или сразу скопировать сюда главу по исключениям?
PM MAIL   Вверх
bsa
Дата 30.6.2010, 10:44 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Код
try {
   //...
} catch(exception_type1 &e) { //исключения типа exception_type1 и его предков
} catch(exception_type2 &e) { //исключения типа exception_type2 и его предков (которые не являются exception_type1)
}
...
catch(...) { //все оставшиеся исключения
}

PM   Вверх
tofreesky
Дата 30.6.2010, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 152
Регистрация: 9.6.2010

Репутация: нет
Всего: нет



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

Код

#include <windows.h>
#include <stdio.h> 
#include <conio.h> 

int main() 
{ 
 try
 {
  int i = i/i-i;
 }
 catch()
 {
  MessageBox(0,"Except!","",0);
 }
 return 0;
}



PM MAIL   Вверх
azesmcar
Дата 30.6.2010, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(tofreesky @  30.6.2010,  14:49 Найти цитируемый пост)
Я почитал пару статей, туда еще классы засовывают, мне ООП не нужно, мне просто в определенном блоке программы нужно поймать любые исключения, деление на ноль, обращение к несуществующей памяти. Как это правильно записать оператор catch требует еще чего-то.

Эти ошибки не ловятся C++-ным try-catch -ом. Можно применить непереносимое решение для Visual Studio, установив опцию проекта Enable C++ Exceptions как Yes with SEH exceptions или используй SEH.
PM   Вверх
tofreesky
Дата 30.6.2010, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 152
Регистрация: 9.6.2010

Репутация: нет
Всего: нет



А как в Linux реализуется SEH или как он там называется?
PM MAIL   Вверх
azesmcar
Дата 30.6.2010, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(tofreesky @  30.6.2010,  14:58 Найти цитируемый пост)
А как в Linux реализуется SEH или как он там называется? 

никак, некоторые вещи можно поймать через сигналы (man signal)
Код

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

void handler (int signum)
{
        printf("handled segmentation fault\n");
        exit(0);
}

struct test {
        int a;
};

int main()
{
        signal(SIGSEGV, handler);
        struct test * p = NULL;
        p->a = 10;
        return 0;
}

PM   Вверх
tofreesky
Дата 30.6.2010, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 152
Регистрация: 9.6.2010

Репутация: нет
Всего: нет



А в GCC, SEH только руками реализовывать? А что не придумали еще библиотеку, что бы при компиляции в Windows использовался SEH, а для Linux сигналы?
PM MAIL   Вверх
azesmcar
Дата 30.6.2010, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(tofreesky @  30.6.2010,  15:13 Найти цитируемый пост)
А в GCC, SEH только руками реализовывать? А что не придумали еще библиотеку, что бы при компиляции в Windows использовался SEH, а для Linux сигналы? 

SEH и сигналы разные понятия, у них разные предназначения, просто немного пересекаются, в данном случае я не вижу ничего сложного написать такой код.
Код

#ifndef WIN32
#include <signal.h>
#else
#include <windows.h>
#endif
#include <stdio.h>
#include <stdlib.h>

void handler (int signum)
{
    printf("handled segmentation fault\n");
    exit(0);
}

struct test
{
    int a;
};

int real_main()
{
    struct test * p = NULL;
    p->a = 10;
    return 0;
}

int main()
{
    #ifndef WIN32
    signal(SIGSEGV, handler);
    return real_main();
    #else
    __try 
    { 
        return real_main();
    } __except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION)
    { 
        handler(0);
    }
    #endif
    return 0;
}

как-то так
PM   Вверх
EvilsInterrupt
Дата 1.7.2010, 23:24 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: нет
Всего: 9



ЗЫ: Мыши плакали, кололись, но продолжали жрать кактус... (с) Рекламная служба "Русское радио"
PM MAIL WWW ICQ Jabber   Вверх
Alexeis
Дата 2.7.2010, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



Цитата(azesmcar @  30.6.2010,  13:54 Найти цитируемый пост)
Можно применить непереносимое решение для Visual Studio, установив опцию проекта Enable C++ Exceptions как Yes with SEH exceptions

  Немного о непереносимости. Билдер ловит все исключения, и аппаратные тоже.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
bsa
Дата 2.7.2010, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(Alexeis @  2.7.2010,  10:39 Найти цитируемый пост)
 Билдер ловит все исключения, и аппаратные тоже.
это SEH и есть.

PM   Вверх
Alexeis
Дата 2.7.2010, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



Цитата(bsa @  2.7.2010,  14:18 Найти цитируемый пост)
это SEH и есть.

  Я имею ввиду что ловит при помощи try{}catch(){} . Т.е. SEH интегрирован с исключениями С++ по умолчанию.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
azesmcar
Дата 2.7.2010, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(Alexeis @  2.7.2010,  09:39 Найти цитируемый пост)
  Немного о непереносимости. Билдер ловит все исключения, и аппаратные тоже. 

Цитата(Alexeis @  2.7.2010,  16:09 Найти цитируемый пост)
SEH интегрирован с исключениями С++ по умолчанию. 

но это никак не делает решение переносимым.
PM   Вверх
Alexeis
Дата 2.7.2010, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



Цитата(azesmcar @  2.7.2010,  15:51 Найти цитируемый пост)
но это никак не делает решение переносимым. 

  Эээ? smile Подумай еще раз. В двух компиляторах try может ловить аппаратные исключения. Это значит что код переносим между ними. Как с этим соотноситься словом "никак"? Я бы согласился на "частично", но если по меньшей мере на 2х компиляторах работает, то слово "никак" уже не применимо smile .


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0612 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.