powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как поймать все исключения?
8 сообщений из 8, страница 1 из 1
Как поймать все исключения?
    #39215583
DayGaykin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изучаю боем C++ и хочу понять тонкости. Сейчас изучаю отлов ошибок.
OS: linux, GCC (-std=c++11)

Сначала я попробовал так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
int main() {
    try {
        int a = 0;
        a = 1/a; // Получаем деление на ноль.
        cout << a << endl;
    } catch (...) {
        cout << "Exception" << endl;
    }
    return 0;
}


Исключение естественно не ловится (т.к. его нет). Программа просто вылетает по сигналу SIGFPE:
Код: sql
1.
Process finished with exit code 136



Дорабатываем код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
void signal_handler(int signo) {
    std::cout << "Signal: " << signo << endl;
    throw signo; // Поднимаем исключение
}

int main() {
    signal(SIGFPE, &signal_handler);
    try {
        int a = 0;
        a = 1/a;
        cout << a << endl;
    } catch (...) {
        cout << "Exception" << endl;
    }
    return 0;
}


Программа выводит:
Код: sql
1.
2.
3.
Signal: 8
terminate called after throwing an instance of 'int'
Process finished with exit code 134


Т.е. исключение так же не поймалось.

Вопрос как его поймать? Как ловить любые исключения?
...
Рейтинг: 0 / 0
Как поймать все исключения?
    #39215704
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Деление на 0, обращение к несуществующей памяти и т.п. это не исключения C++.
В виндоусе для подобного есть SEH, в линуксе не сталкивался, вроде как ничего подобного нет, изобретают какие-то велосипеды с сигналами.

По-хорошему в таких случаях надо вылетать и делать повторный запуск.
...
Рейтинг: 0 / 0
Как поймать все исключения?
    #39215816
YesSql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DayGaykinИзучаю боем C++ и хочу понять тонкости. Сейчас изучаю отлов ошибок.
OS: linux, GCC (-std=c++11)

Сначала я попробовал так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
int main() {
    try {
        int a = 0;
        a = 1/a; // Получаем деление на ноль.
        cout << a << endl;
    } catch (...) {
        cout << "Exception" << endl;
    }
    return 0;
}


Исключение естественно не ловится (т.к. его нет). Программа просто вылетает по сигналу SIGFPE:
Код: sql
1.
Process finished with exit code 136



Дорабатываем код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
void signal_handler(int signo) {
    std::cout << "Signal: " << signo << endl;
    throw signo; // Поднимаем исключение
}

int main() {
    signal(SIGFPE, &signal_handler);
    try {
        int a = 0;
        a = 1/a;
        cout << a << endl;
    } catch (...) {
        cout << "Exception" << endl;
    }
    return 0;
}


Программа выводит:
Код: sql
1.
2.
3.
Signal: 8
terminate called after throwing an instance of 'int'
Process finished with exit code 134


Т.е. исключение так же не поймалось.

Вопрос как его поймать? Как ловить любые исключения?

добавь к GCC флаг -fnon-call-exceptions
...
Рейтинг: 0 / 0
Как поймать все исключения?
    #39215946
DayGaykin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YesSqlдобавь к GCC флаг -fnon-call-exceptions
Сработало! Спасибо. Если не затруднит, можно пару слов о том, что этот флаг делает?
...
Рейтинг: 0 / 0
Как поймать все исключения?
    #39216032
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DayGaykinYesSqlдобавь к GCC флаг -fnon-call-exceptions
Сработало! Спасибо. Если не затруднит, можно пару слов о том, что этот флаг делает?Добавляет в твою программу процедуру обработки трапов (исключений которые кидает ОС) и превращение их в языковые исключения.
https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html
...
Рейтинг: 0 / 0
Как поймать все исключения?
    #39216073
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То же есть и в MSVC, только там еще и SEH ловят. Тоже по социальному флагу.
и тоже превращают в исключения C++.
...
Рейтинг: 0 / 0
Как поймать все исключения?
    #39216488
YesSql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DayGaykinYesSqlдобавь к GCC флаг -fnon-call-exceptions
Сработало! Спасибо. Если не затруднит, можно пару слов о том, что этот флаг делает?
Никогда не ковырялся в этом. Могу только пофантазировать. Когда происходит процессорное исключение например по делению на 0 стэк потока модифицируется системой. Система вызывает обработчик сигнала и С++ исключение брошенное в этом обработчике неможет раскрутить стэк. Т.е. компилятор должен завести статические переменные потока с помощью которых можно выловить изменения стэка системой. И должен держать их актуальными при каждом изменении стэка программой. В этом случае С++ исключение брошенное в обработчике сигнала будет знать как раскрутить стэк.
...
Рейтинг: 0 / 0
Как поймать все исключения?
    #39216564
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гайкин. А попробуй целые числа заменить на double. Каков будет резалт?
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как поймать все исключения?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]