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

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

Войти
Регистрация
Восстановить пароль
 
Тамика
Котовчанин
870 / 450 / 143
Регистрация: 16.02.2010
Сообщений: 2,954
Записей в блоге: 27
#1

Снова try catch - C++

21.03.2014, 12:05. Просмотров 408. Ответов 11
Метки нет (Все метки)

Доброе утро всем!
Недавно спрашивала как работать с блоками try ... catch. В общем, прозрение так и не пришло, но доделать код хочется. Вот сделала пока такую штуку
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int_array::int_array(int n)
{
    try{
    if (n < 0)
        throw "Cannot initialize array with negative count of elements!";
 
    mas = new int[n];
    for (int i = 0; i < n; ++i)
        mas[i] = 0;
    size = n;
    capacity = n;
    }
    catch(const char* msg)
    {
        std::cout << msg;
    }
}
Теперь вопрос... Как сделать обработку исключения? То есть... Я не хочу в этом классе обрабатывать исключение, не хочу в этом классе делать вывод сообщения. Хочу сделать обработку в другом классе, Error например. Как это можно реализовать?
Заранее спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.03.2014, 12:05     Снова try catch
Посмотрите здесь:

try-catch - C++
Какой тип проекта создавать в Visual Studio чтобы можно было сделать обработку исключений с try-catch? Или что сделать в Code Blocks с той...

try . catch - C++
можно ли провести данную операцию для функции erase у вектора??? пытался, что-то не получилось: #include &lt;vector&gt; #include &lt;algorithm&gt; ...

try catch - C++
Здравствуйте. В c++ новичёк, с try catch никогда толком не работал, а тут пришлось. Нужно сделать защиту от ввода всего кроме цифр. вот...

try-catch - C++
Читаю книгу Страуструпа. Он пишет (стр 232), что можно не передавать обработчику исключений какое либо значение. #include...

TRY/CATCH - C++
Здравствуйте! У меня есть: MASS; для простоты пояснения, x=rand();y=rand(),znacheniye=rand(); Как игнорировать ошибки...

Исключения try-catch - C++
Здравствуйте, пытаюсь с помощь try-catch сделать обработку исключений. #include &lt;iostream&gt; #include &lt;cmath&gt; #include &lt;cstdlib&gt; ...

Конструкция try . catch - C++
Здравствуйте. Подскажите, как продолжить работу программи после обнаружения ошибки конструкцией try ... catch. #include...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,013
21.03.2014, 12:06     Снова try catch #2
Ну вообще это странно, что в данном случае хочется выводить сообщения прямо тут... А по теме, в блок catch добавьте после вывода сообщения:
C++
1
throw;
Тамика
Котовчанин
870 / 450 / 143
Регистрация: 16.02.2010
Сообщений: 2,954
Записей в блоге: 27
21.03.2014, 12:08  [ТС]     Снова try catch #3
А зачем?
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,013
21.03.2014, 12:13     Снова try catch #4
Чтобы бросить текущее обрабатываемое исключение дальше
http://ideone.com/fdXvc9
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
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <stdexcept>
 
class IntArray
{
public:
    IntArray(int size)
    {
        try
        {
            if (size < 0)
            {
                throw std::invalid_argument("Bad size");
            }
        }
        catch (const std::invalid_argument& ex)
        {
            std::cout << "IntArray::IntArray: " << ex.what() << std::endl;
            throw;
        }
    }
};
 
int main()
{
    try
    {
        IntArray a(-1);
    }
    catch (const std::invalid_argument& ex)
    {
        std::cout << "main: " << ex.what() << std::endl;
    }
    return 0;
}
Тамика
Котовчанин
870 / 450 / 143
Регистрация: 16.02.2010
Сообщений: 2,954
Записей в блоге: 27
21.03.2014, 12:15  [ТС]     Снова try catch #5
ex.what()
А что эта функция делает?
DrOffset
7060 / 4201 / 949
Регистрация: 30.01.2014
Сообщений: 6,968
21.03.2014, 12:15     Снова try catch #6
Цитата Сообщение от Тамика Посмотреть сообщение
Я не хочу в этом классе обрабатывать исключение, не хочу в этом классе делать вывод сообщения.
Ловить, чтобы вывести сообщение, потом опять бросать может быть не совсем эффективно. Этим пользоваться нужно в других, более сложных случаях. А в тут можно просто:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int_array::int_array(int n)
{
    if (n < 0)
    {
        char const * msg = "Cannot initialize array with negative count of elements!";
        std::cout << msg; 
        throw msg;
    } 
    mas = new int[n];
    for (int i = 0; i < n; ++i)
        mas[i] = 0;
    size = n;
    capacity = n;
}
А обрабатывать уже в другом месте. Если хочется постоянно иметь лог места, где выброшено исключение - можно сделать вот так:
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
inline 
void throw_mylib_exception(char const * mes, char const * func, char const * file, int line)
{
    std::cout << "exception thrown from function " << func << " at file " << file << ", line " << line << std::endl;
    throw mes;
}
 
#define THROW_MYLIB_EXCEPTION(mes) \
     throw_mylib_exception(mes, __FUNCTION__, __FILE__, __LINE__)
 
......
 
int_array::int_array(int n)
{
    if (n < 0)
    {
        THROW_MYLIB_EXCEPTION("Cannot initialize array with negative count of elements!");
    } 
    mas = new int[n];
    for (int i = 0; i < n; ++i)
        mas[i] = 0;
    size = n;
    capacity = n;
}
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,013
21.03.2014, 12:17     Снова try catch #7
Цитата Сообщение от Тамика Посмотреть сообщение
А что эта функция делает?
Смотрим в доки
раз http://www.cplusplus.com/reference/exception/exception/
два http://www.cplusplus.com/reference/e...xception/what/
три http://www.cplusplus.com/reference/s...alid_argument/

Словами: в конструктор исключения я передал строку с описанием ошибки, она доступна через метод what().
DrOffset
7060 / 4201 / 949
Регистрация: 30.01.2014
Сообщений: 6,968
21.03.2014, 12:22     Снова try catch #8
Ну и присоединяюсь к 0x10, кидать указатель на строку в качестве исключения не совсем кошерно. Использовать соответствующие классы или написать свои, заимев при этом требуемую типобезопасность, гораздо лучше.
Тамика
Котовчанин
870 / 450 / 143
Регистрация: 16.02.2010
Сообщений: 2,954
Записей в блоге: 27
21.03.2014, 12:34  [ТС]     Снова try catch #9
Огромное спасибо! Кое-что прояснили...
Сделала так:
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 int_array::erase(int index)
{
    try
    {
        if (index < 0) 
            throw std::invalid_argument("Bad index to erase!");
        if (index > size) 
            throw std::invalid_argument("Index out of range!");
        int *temp = new int[size-1];
        for (int i = 0; i < index; ++ i)
            temp[i] = mas[i];
        for (int i = index + 1; i < size; ++i)
            temp[i - 1] = mas[i];
        size = size - 1;
        int *t = mas;
        mas = temp;
        delete [] t;
    }
    catch(const std::invalid_argument& ex)
    {
        throw;
    }
}
А в мейне делаю обработку
C++
1
2
3
4
5
6
7
8
9
10
11
int main(){
...
    catch(const std::invalid_argument& ex)
    {
        switch(ex.what())
        {
            
        }
    }
 
}
Почему так нельзя?..(
Хочу, в зависимости от приходящего сообщения, разные обработки делать... А компилятор ругается. Я опять что-то недопоняла.
DrOffset
7060 / 4201 / 949
Регистрация: 30.01.2014
Сообщений: 6,968
21.03.2014, 12:41     Снова try catch #10
При таком варианте 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 int_array::erase(int index)
{
    //try
    //{
        if (index < 0) 
            throw std::invalid_argument("Bad index to erase!");
        if (index > size) 
            throw std::invalid_argument("Index out of range!");
        int *temp = new int[size-1];
        for (int i = 0; i < index; ++ i)
            temp[i] = mas[i];
        for (int i = index + 1; i < size; ++i)
            temp[i - 1] = mas[i];
        size = size - 1;
        int *t = mas;
        mas = temp;
        delete [] t;
    //}
    //catch(const std::invalid_argument& ex)
    //{
    //    throw;
    //}
}
Цитата Сообщение от Тамика Посмотреть сообщение
Почему так нельзя?..(
В switch можно только интегральные типы сравнивать с интегральными константами.

Правильный способ либо завести по типу исключения на каждый тип ошибки,
C++
1
2
3
4
5
6
7
8
9
10
11
12
try
{
 ....
}
catch(bad_index const &)
{
...
}
catch(out_of_range const &)
{
...
}
либо (что чуть хуже) передавать помимо строки еще и тип ошибки в виде константы (например из enum). Тестить саму строку с исключением как-то не очень.
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,013
21.03.2014, 12:43     Снова try catch #11
Цитата Сообщение от DrOffset Посмотреть сообщение
Тестить саму строку с исключением как-то не очень
Да еще и в switch.

Тамика, по-моему, это тот момент, когда надо просто открыть книгу или документацию, примеры есть.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.03.2014, 12:56     Снова try catch
Еще ссылки по теме:

Trow,try,catch, - C++
Всем привет.Ребят помогите разобраться пожалуйста с таким вопросом.Как правильно использовать try,catch,throw. Вот программа переводящая...

Try-catch-fanally - C++
Что значат блоки Try-catch-fanally?

DeleteFile и try.catch - C++
Удаляю файл через DeleteFile.Могут быть 2 ошибки:не существует и открыт. Как прикрутить сюда try - catch именно при ошибке удаления,если...

Ошибка try catch - C++
try { int x=StrToInt(Edit_Chislo-&gt;Text); } catch (const EConvertError &amp;) { ...

Catch(.) не срабатывает - C++
Имеется такой фрагмент код: HANDLE hData = GetClipboardData(CF_TEXT | CF_LOCALE); char* chBuffer = (char*)GlobalLock(hData); try...


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

Или воспользуйтесь поиском по форуму:
Тамика
Котовчанин
870 / 450 / 143
Регистрация: 16.02.2010
Сообщений: 2,954
Записей в блоге: 27
21.03.2014, 12:56  [ТС]     Снова try catch #12
по-моему, это тот момент, когда надо просто открыть книгу или документацию, примеры есть.
Этот момент уже был. Потому и написала на форум. Всегда, перед тем, как обратиться сюда, я пытаюсь разобраться сама. Если не выходит - пишу.
Yandex
Объявления
21.03.2014, 12:56     Снова try catch
Ответ Создать тему
Опции темы

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