Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.03.2015, 20:11   #1
cooljedi
Пользователь
 
Регистрация: 20.03.2015
Сообщений: 10
По умолчанию Вопрос насчет исключений

Хочу уточнить насчет исключений, т.к. не особо часто ими пользовался. Вот в классе есть у нас исключения, но нету блоков try. Мне нужно чтобы если будет исключение ни в коем случае не завершать программу, и не выдавать никаких окон, но просто можно ставить переменную что исключение было, и завершать выполнение потока, в котором работает данный класс. Если нету блоков try а только throw то как это организовать? То есть мне нужно каждый раз когда выдается исключение завершать текущий поток, и поставить bool переменную что поток не работает. Как посоветуете это сделать? В крайнем случае придется вместо throw подставлять этот код...
cooljedi вне форума Ответить с цитированием
Старый 21.03.2015, 20:55   #2
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Мы не сможете обработать исключение без try/catch
8Observer8 вне форума Ответить с цитированием
Старый 21.03.2015, 23:52   #3
cooljedi
Пользователь
 
Регистрация: 20.03.2015
Сообщений: 10
По умолчанию

ну тогда что даёт throw?
cooljedi вне форума Ответить с цитированием
Старый 22.03.2015, 00:01   #4
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

throw выбрасывает исключение. Функцию, которая содержит throw, нужно помещать в блок try, а в catch писать обработчик-перехватчик

Код:
#include <iostream>
#include <stdexcept>

void func( int a )
{
    if ( a == 0 )
        throw std::invalid_argument( "Error: invalid argiment in func()" );

    // ...
}

int main()
{
    try
    {
        func( 0 );
    }
    catch( const std::invalid_argument &e )
    {
        std::cout << e.what() << std::endl;
    }

    return 0;
}
Вот список всех исключений: http://www.cplusplus.com/reference/stdexcept/

Можно везде использовать, например, std::runtime_error, но лучше по близкому значению. А ещё лучше писать свои классы исключений. Лично я пока вообще без исключений обхожусь. Хотя штука удобная, но почему-то большинсво не использует исключения, как мне кажется

Последний раз редактировалось Stilet; 22.03.2015 в 09:29.
8Observer8 вне форума Ответить с цитированием
Старый 22.03.2015, 00:27   #5
cooljedi
Пользователь
 
Регистрация: 20.03.2015
Сообщений: 10
По умолчанию

хм, ладно, я в общем вместо throw тогда напишу завершение потока, т.к. из класса ведь нельзя просто return NULL написать )

но я не тестировал, наверное само по себе исключение завершит поток, хотя если их не использую то лучше и вовсе убрать.

Меня еще сейчас волнует вопрос, насколько достоверен будет результат функции GetExitCodeThread != STILL_ACTIVE (проверка жив ли поток по его хэндлу)
cooljedi вне форума Ответить с цитированием
Старый 22.03.2015, 00:31   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

try catch внезапно можно использовать не только внутри метода/класса с throw.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 22.03.2015, 00:45   #7
cooljedi
Пользователь
 
Регистрация: 20.03.2015
Сообщений: 10
По умолчанию

Мне просто нужно чтоб не было сообщений про исключения, если будет throw, ну выскакивающих алертов и т.д.
cooljedi вне форума Ответить с цитированием
Старый 22.03.2015, 01:13   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну и поставьте try catch в том месте, где эти методы класса используете. Или на весь код потока раз просто завершить надо.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 22.03.2015 в 10:19.
Alex11223 вне форума Ответить с цитированием
Старый 22.03.2015, 01:14   #9
cooljedi
Пользователь
 
Регистрация: 20.03.2015
Сообщений: 10
По умолчанию

Если в классе исключение срабатывает, то вся программа завершается, а меня это не устраивает... мне нужно чтобы завершался только поток... поэтому я создаю объект класса в потоке, но в самом классе прерыванием всё равно вызывает завершение всей программы ((( так что throw придется убирать... жаль что нельзя без try словить все throw... а то они разбросаны по всему классу

Цитата:
Или на весь код потока раз просто завершить надо.
а кстати да, это идея. ох заработался...
всем спасибо.

Последний раз редактировалось cooljedi; 22.03.2015 в 01:30.
cooljedi вне форума Ответить с цитированием
Старый 22.03.2015, 09:23   #10
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Цитата:
Если в классе исключение срабатывает, то вся программа завершается, а меня это не устраивает...
Не понимаю о чём вы. Если метод объекта класса выбросил исключение, то вы сами решаете, что сделать дальше, для этого вы пишите код в блоке catch. А в try же пишится код, который может выбросить исключение, а может и не выбросить. Вот как это будет с объектом класса:

Код:
#include <iostream>
#include <stdexcept>

class MyClass
{
public:
    void func( int a )
    {
        if ( a == 0 )
            throw std::invalid_argument( "Error: invalid argiment in func()" );

        std::cout << "a = " << a << std::endl;
    }
};

int main()
{
    // Этот код не выбрасывает исключение, поэтому блок catch не выполнится
    try
    {
        MyClass mc;
        mc.func( 1 );
    }
    catch( const std::invalid_argument &e )
    {
        std::cout << e.what() << std::endl;
    }

    // Выбрасывается исключение, которое отлавливается в блоке catch
    try
    {
        MyClass mc;
        mc.func( 0 );
    }
    catch( const std::invalid_argument &e )
    {
        std::cout << e.what() << std::endl;
        std::cout << "Exception: a = 0" << std::endl;
        return 1;
    }

    return 0;
}
8Observer8 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос насчет издания игр koljsch Gamedev - cоздание игр: Unity, OpenGL, DirectX 14 15.08.2013 08:08
Вопрос насчет автоматического распределения по категориям.. mydomen Помощь студентам 5 30.01.2013 14:36
VBA вопрос насчет ComboBox qert Microsoft Office Excel 11 09.12.2009 17:20
Вопрос насчет функции sort TOLIK111 Общие вопросы C/C++ 1 06.12.2009 15:57
Вопрос насчет курсоров и печати изображения Romich Общие вопросы Delphi 10 11.06.2009 02:05